-
Notifications
You must be signed in to change notification settings - Fork 2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Create a convenience command for generating example CSI volume specifications, similar to the existing `nomad job init` or `nomad quota init` commands.
- Loading branch information
Showing
6 changed files
with
197 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,154 @@ | ||
package command | ||
|
||
import ( | ||
"fmt" | ||
"io/ioutil" | ||
"os" | ||
"strings" | ||
|
||
"github.com/posener/complete" | ||
) | ||
|
||
const ( | ||
// DefaultHclVolumeInitName is the default name we use when initializing | ||
// the example volume file in HCL format | ||
DefaultHclVolumeInitName = "volume.hcl" | ||
|
||
// DefaultHclVolumeInitName is the default name we use when initializing | ||
// the example volume file in JSON format | ||
DefaultJsonVolumeInitName = "volume.json" | ||
) | ||
|
||
// VolumeInitCommand generates a new volume spec that you can customize to | ||
// your liking, like vagrant init | ||
type VolumeInitCommand struct { | ||
Meta | ||
} | ||
|
||
func (c *VolumeInitCommand) Help() string { | ||
helpText := ` | ||
Usage: nomad volume init | ||
Creates an example volume specification file that can be used as a starting | ||
point to customize further. | ||
Init Options: | ||
-json | ||
Create an example JSON volume specification. | ||
` | ||
return strings.TrimSpace(helpText) | ||
} | ||
|
||
func (c *VolumeInitCommand) Synopsis() string { | ||
return "Create an example volume specification file" | ||
} | ||
|
||
func (c *VolumeInitCommand) AutocompleteFlags() complete.Flags { | ||
return complete.Flags{ | ||
"-json": complete.PredictNothing, | ||
} | ||
} | ||
|
||
func (c *VolumeInitCommand) AutocompleteArgs() complete.Predictor { | ||
return complete.PredictNothing | ||
} | ||
|
||
func (c *VolumeInitCommand) Name() string { return "volume init" } | ||
|
||
func (c *VolumeInitCommand) Run(args []string) int { | ||
var jsonOutput bool | ||
flags := c.Meta.FlagSet(c.Name(), FlagSetClient) | ||
flags.Usage = func() { c.Ui.Output(c.Help()) } | ||
flags.BoolVar(&jsonOutput, "json", false, "") | ||
|
||
if err := flags.Parse(args); err != nil { | ||
return 1 | ||
} | ||
|
||
// Check that we get no arguments | ||
args = flags.Args() | ||
if l := len(args); l != 0 { | ||
c.Ui.Error("This command takes no arguments") | ||
c.Ui.Error(commandErrorText(c)) | ||
return 1 | ||
} | ||
|
||
fileName := DefaultHclVolumeInitName | ||
fileContent := defaultHclVolumeSpec | ||
if jsonOutput { | ||
fileName = DefaultJsonVolumeInitName | ||
fileContent = defaultJsonVolumeSpec | ||
} | ||
|
||
// Check if the file already exists | ||
_, err := os.Stat(fileName) | ||
if err != nil && !os.IsNotExist(err) { | ||
c.Ui.Error(fmt.Sprintf("Failed to stat %q: %v", fileName, err)) | ||
return 1 | ||
} | ||
if !os.IsNotExist(err) { | ||
c.Ui.Error(fmt.Sprintf("Volume specification %q already exists", fileName)) | ||
return 1 | ||
} | ||
|
||
// Write out the example | ||
err = ioutil.WriteFile(fileName, []byte(fileContent), 0660) | ||
if err != nil { | ||
c.Ui.Error(fmt.Sprintf("Failed to write %q: %v", fileName, err)) | ||
return 1 | ||
} | ||
|
||
// Success | ||
c.Ui.Output(fmt.Sprintf("Example volume specification written to %s", fileName)) | ||
return 0 | ||
} | ||
|
||
var defaultHclVolumeSpec = strings.TrimSpace(` | ||
id = "ebs_prod_db1" | ||
name = "database" | ||
type = "csi" | ||
external_id = "vol-23452345" | ||
access_mode = "single-node-writer" | ||
attachment_mode = "file-system" | ||
mount_options { | ||
fs_type = "ext4" | ||
mount_flags = ["ro"] | ||
} | ||
secrets { | ||
example_secret = "xyzzy" | ||
} | ||
parameters { | ||
skuname = "Premium_LRS" | ||
} | ||
context { | ||
endpoint = "http://192.168.1.101:9425" | ||
} | ||
`) | ||
|
||
var defaultJsonVolumeSpec = strings.TrimSpace(` | ||
{ | ||
"id": "ebs_prod_db1", | ||
"name": "database", | ||
"type": "csi", | ||
"external_id": "vol-23452345", | ||
"access_mode": "single-node-writer", | ||
"attachment_mode": "file-system", | ||
"mount_options": { | ||
"fs_type": "ext4", | ||
"mount_flags": [ | ||
"ro" | ||
] | ||
}, | ||
"secrets": { | ||
"example_secret": "xyzzy" | ||
}, | ||
"parameters": { | ||
"skuname": "Premium_LRS" | ||
}, | ||
"context": { | ||
"endpoint": "http://192.168.1.101:9425" | ||
} | ||
} | ||
`) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
--- | ||
layout: docs | ||
page_title: 'Commands: volume init' | ||
sidebar_title: init | ||
description: | | ||
Generate an example volume specification. | ||
--- | ||
|
||
# Command: volume init | ||
|
||
The `volume init` command is used to create an example volume specification | ||
file that can be used as a starting point to customize further. | ||
|
||
## Usage | ||
|
||
```plaintext | ||
nomad volume init | ||
``` | ||
|
||
## Init Options | ||
|
||
- `-json`: Create an example JSON volume specification. | ||
|
||
## Examples | ||
|
||
Create an example volume specification: | ||
|
||
```shell-session | ||
$ nomad volume init | ||
Example volume specification written to volume.hcl | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters