// Copyright (c) 2015-2021 MinIO, Inc. // // This file is part of MinIO Object Storage stack // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . package nas import ( "context" "github.com/minio/cli" minio "github.com/minio/minio/cmd" "github.com/minio/minio/pkg/auth" "github.com/minio/minio/pkg/madmin" ) func init() { const nasGatewayTemplate = `NAME: {{.HelpName}} - {{.Usage}} USAGE: {{.HelpName}} {{if .VisibleFlags}}[FLAGS]{{end}} PATH {{if .VisibleFlags}} FLAGS: {{range .VisibleFlags}}{{.}} {{end}}{{end}} PATH: path to NAS mount point EXAMPLES: 1. Start minio gateway server for NAS backend {{.Prompt}} {{.EnvVarSetCommand}} MINIO_ROOT_USER{{.AssignmentOperator}}accesskey {{.Prompt}} {{.EnvVarSetCommand}} MINIO_ROOT_PASSWORD{{.AssignmentOperator}}secretkey {{.Prompt}} {{.HelpName}} /shared/nasvol 2. Start minio gateway server for NAS with edge caching enabled {{.Prompt}} {{.EnvVarSetCommand}} MINIO_ROOT_USER{{.AssignmentOperator}}accesskey {{.Prompt}} {{.EnvVarSetCommand}} MINIO_ROOT_PASSWORD{{.AssignmentOperator}}secretkey {{.Prompt}} {{.EnvVarSetCommand}} MINIO_CACHE_DRIVES{{.AssignmentOperator}}"/mnt/drive1,/mnt/drive2,/mnt/drive3,/mnt/drive4" {{.Prompt}} {{.EnvVarSetCommand}} MINIO_CACHE_EXCLUDE{{.AssignmentOperator}}"bucket1/*,*.png" {{.Prompt}} {{.EnvVarSetCommand}} MINIO_CACHE_QUOTA{{.AssignmentOperator}}90 {{.Prompt}} {{.EnvVarSetCommand}} MINIO_CACHE_AFTER{{.AssignmentOperator}}3 {{.Prompt}} {{.EnvVarSetCommand}} MINIO_CACHE_WATERMARK_LOW{{.AssignmentOperator}}75 {{.Prompt}} {{.EnvVarSetCommand}} MINIO_CACHE_WATERMARK_HIGH{{.AssignmentOperator}}85 {{.Prompt}} {{.HelpName}} /shared/nasvol ` minio.RegisterGatewayCommand(cli.Command{ Name: minio.NASBackendGateway, Usage: "Network-attached storage (NAS)", Action: nasGatewayMain, CustomHelpTemplate: nasGatewayTemplate, HideHelpCommand: true, }) } // Handler for 'minio gateway nas' command line. func nasGatewayMain(ctx *cli.Context) { // Validate gateway arguments. if !ctx.Args().Present() || ctx.Args().First() == "help" { cli.ShowCommandHelpAndExit(ctx, minio.NASBackendGateway, 1) } minio.StartGateway(ctx, &NAS{ctx.Args().First()}) } // NAS implements Gateway. type NAS struct { path string } // Name implements Gateway interface. func (g *NAS) Name() string { return minio.NASBackendGateway } // NewGatewayLayer returns nas gatewaylayer. func (g *NAS) NewGatewayLayer(creds auth.Credentials) (minio.ObjectLayer, error) { var err error newObject, err := minio.NewFSObjectLayer(g.path) if err != nil { return nil, err } return &nasObjects{newObject}, nil } // Production - nas gateway is production ready. func (g *NAS) Production() bool { return true } // IsListenSupported returns whether listen bucket notification is applicable for this gateway. func (n *nasObjects) IsListenSupported() bool { return false } func (n *nasObjects) StorageInfo(ctx context.Context) (si minio.StorageInfo, _ []error) { si, errs := n.ObjectLayer.StorageInfo(ctx) si.Backend.GatewayOnline = si.Backend.Type == madmin.FS si.Backend.Type = madmin.Gateway return si, errs } // nasObjects implements gateway for MinIO and S3 compatible object storage servers. type nasObjects struct { minio.ObjectLayer } func (n *nasObjects) IsTaggingSupported() bool { return true }