diff --git a/CHANGELOG.md b/CHANGELOG.md index bccbb423a..c041f5a79 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,56 @@ max_delay = 10m # interpreted as 10m in om2 and om3 => Good ``` +## What's New in v3 + +OpenSVC v3 is a major evolution, rebuilt in Go for performance, reliability, and maintainability. Beyond the migration considerations, v3 introduces exciting new capabilities: + +### Architecture & Performance + +* **Complete Go rewrite**: The agent is now written in Go, delivering a compiled, statically-linked binary with improved performance, memory safety, and lower resource footprint compared to the Python v2 agent. + +* **Simplified deployment**: Single binary distribution with minimal dependencies. + +* **OpenAPI 3 based API**: Modern RESTful API with OpenAPI 3 specification, served over both Unix socket and inet, with bearer token authentication, replacing the custom raw JSON-RPC protocol. + +### User Experience + +* **New `ox` terminal UI**: A dedicated terminal interface for real-time cluster monitoring and management, complementing the `om` CLI. Open an `ox` session to watch services move around the cluster interactively. + +* **Enhanced logging with journald**: All agent logs now integrate with systemd-journald, enabling fast filtering with `journalctl _COMM=om` and adding indexed attributes like `OBJ_PATH` for precise log queries. + +### Orchestration & Management + +* **Live migration for KVM**: Full support for live migration of KVM instances with data on `disk.disk` and `disk.drbd` resources using `om switch --live` and `om takeover --live` commands. + +* **New placement policy**: `last start` policy uses the mtime of `/last_start` as the candidate sort key, with more recent starts having higher priority. + +* **Improved object labels**: Enhanced support for labeling objects, enabling better organization and selection. Labels help third-party solutions like backup tools, ingress gateways, and monitoring systems identify and handle objects appropriately. + +* **Better container management**: New commands for container operations including `om container ls`, `om container enter `, and `om container logs `. + +* **Task management**: New commands for task operations including `om task ls` and `om task run `. + +* **Resource group commands**: New per-driver-group command sets for more targeted resource management. + +### Configuration & Operations + +* **Unified configuration update**: The new `update` command with `--set`, `--unset`, and `--delete` flags allows atomic commits for different types of configuration changes. + +* **Quiet mode**: New `--quiet` flag for instance actions disables both progress rendering and console logging, useful for scripts and automation. + +* **Enhanced secret management**: New commands like `om key rename` for better key management in secret stores. + +### Network & Storage + +* **Modern firewall management**: Configuration now uses nftables exclusively, with better support for large subnets including IPv6 via the new `mask_per_node` keyword. + +* **Improved mount monitoring**: New daemon manager (`mntmon`) for monitoring mount events and refreshing instance status when mounts change. + +* **Network event handling**: New daemon network monitor (`netmon`) relays netlink events to pubsub, enabling faster response to network changes. + +* **New install keyword**: For fs and volume resources, the new `install` keyword enables deployment of complex file trees on start, with support for sec keys, cfg keys, local files or remote URIs, file/directory nesting, and user/group/permission setup. + ## Breaking Changes ### Cluster and Node Configuration diff --git a/Makefile b/Makefile index deea53085..c4b1d45e8 100644 --- a/Makefile +++ b/Makefile @@ -114,6 +114,10 @@ restart: test: $(GOTEST) -p 1 -timeout 60s ./... +test-cover: + $(GOTEST) -p 1 -timeout 60s -race -coverprofile=coverage.out ./... + $(GOCMD) tool cover -html=coverage.out -o coverage.html + testinfo: TEST_LOG_LEVEL=info $(GOTEST) -p 1 -timeout 60s ./... @@ -124,3 +128,28 @@ vet: $(GOVET) ./... +help: + @echo "Available targets:" + @echo " api - Generate the api code from api.yaml" + @echo " build - Build om and ox" + @echo " compobj - Build the compliance modules pack" + @echo " dist - Build, strip binaries and make a tarball" + @echo " om - Build om" + @echo " ox - Build ox" + @echo " install - Install o[mx] to /usr/bin" + @echo " restart - Restart the daemon" + @echo " deploy - Install and restart on all nodes" + @echo " clean - Clean build artifacts" + @echo " deps - Update dependencies" + @echo " test - Run tests" + @echo " test-cover - Run tests with coverage" + @echo " vet - Run go static analyzer" + @echo " version - Update the version string from git status" + @echo + @echo "Available -race targets:" + @echo " build-race - Build om and ox if race-free" + @echo " compobj-race - Build the compliance modules pack if race-free" + @echo " om-race - Build om if race-free" + @echo " ox-race - Build ox if race-free" + @echo " test-race - Run tests with race detection" + diff --git a/README.md b/README.md index c8213f742..53adaadd0 100644 --- a/README.md +++ b/README.md @@ -1,31 +1,36 @@ -# README.md +# om3 [![Go](https://github.com/opensvc/om3/actions/workflows/go.yml/badge.svg?branch=main)](https://github.com/opensvc/om3/actions/workflows/go.yml) -**_NOTE:_** This project is the golang port and next release of https://github.com/opensvc/opensvc. +*The Go port and continuation of [opensvc/opensvc](https://github.com/opensvc/opensvc).* -> **_NOTE:_** General Availability is expected Q1 2025 +om3 is a cluster orchestrator for small-to-mid clusters — a coherent alternative to +stitching together systemd, container runtimes, and ad-hoc scripts, with symmetric +orchestration on every node. -A cluster orchestrator with a distinctive feature set -===================================================== +## Features -* Simple and powerful -* Targeted at 1-32 nodes clusters -* Human readable services configurations and status -* Coherent alternative to a wide range of integration methods: from systemd to kubernetes -* Highly redundant cluster communications (ucast, mcast, disk, 3rd site relay) -* All nodes symmetric orchestration policies -* Orchestrate application stacks based on containers, and much more -* Provision stacks from template configurations, including disk, vg, fs, ip -* Optional CNI cluster networks, cluster DNS, ingress gateways -* DevOps, or pipelined delivery +* Targeted at 1-32 node clusters, human-readable service configurations and status +* Highly redundant cluster communications (unicast, multicast, disk, third-site relay) +* Deploy application stacks on containers, persistent or volatile volumes, or + low-level resources — disks, volume groups, filesystems, IP addresses, app launchers +* Native, zeroconf, encrypted datastores, with keys exposed as files for your deployments +* Manage everything through the API, the `om` command line, or the `ox` terminal UI -Dig Agent Features -================== +## Install -https://book.opensvc.com +See the [installation guide](https://book.opensvc.com/agent/install.html) — the +complete documentation lives there too. -Agent Installation -================== +## Play -https://book.opensvc.com/agent/install.html +Deploy a simple service: +``` +om test/svc/simple deploy --kw fs#1.type=flag --kw nodes='*' --kw orchestrate=ha +``` +Then open an `ox` session and watch it move around the cluster. + +## Examples + +Browse [ready-to-use templates](https://github.com/opensvc/opensvc_templates) — VIPs, +cluster DNS, ingress gateways, ACME, HA NFS, meshed VPN backend networks, and more. diff --git a/core/commoncmd/factory_kind.go b/core/commoncmd/factory_kind.go new file mode 100644 index 000000000..6ad0b5553 --- /dev/null +++ b/core/commoncmd/factory_kind.go @@ -0,0 +1,221 @@ +package commoncmd + +import ( + "github.com/spf13/cobra" +) + +// NewCmdAll creates the "all" command +func NewCmdAll() *cobra.Command { + return &cobra.Command{ + Use: "all", + Short: "manage a mix of objects, tentatively exposing all commands", + } +} + +// NewCmdCcfg creates the "ccfg" command +func NewCmdCcfg() *cobra.Command { + return &cobra.Command{ + Use: "ccfg", + Short: "manage the cluster shared configuration", + Long: `The cluster nodes merge their private configuration +over the cluster shared configuration. + +The shared configuration is hosted in a ccfg-kind object, and is +replicated using the same rules as other kinds of object (last write is +eventually replicated).`, + } +} + +// NewCmdCfg creates the "cfg" command +func NewCmdCfg() *cobra.Command { + return &cobra.Command{ + Use: "cfg", + Short: "manage configmaps", + Long: `A configmap is an unencrypted key-value store. + +Values can be binary or text. + +A key can be installed as a file in a Vol, then exposed to apps +and containers. + +A key can be exposed as a environment variable for apps and +containers. + +A signal can be sent to consumer processes upon exposed key value +changes. + +The key names can include the '/' character, interpreted as a path separator +when installing the key in a volume.`, + } +} + +// NewCmdSec creates the "sec" command +func NewCmdSec() *cobra.Command { + return &cobra.Command{ + Use: "sec", + Short: "manage secrets", + Long: `A secret is an encrypted key-value store. + +Values can be binary or text. + +A key can be installed as a file in a Vol, then exposed to apps +and containers. + +A key can be exposed as a environment variable for apps and +containers. + +A signal can be sent to consumer processes upon exposed key value +changes. + +The key names can include the '/' character, interpreted as a path separator +when installing the key in a volume.`, + } +} + +// NewCmdSVC creates the "svc" command +func NewCmdSVC() *cobra.Command { + return &cobra.Command{ + Use: "svc", + Short: "manage services", + Long: `Service objects subsystem. + +A service is typically made of ip, app, container and task resources. + +They can use support objects like volumes, secrets and configmaps to +isolate lifecycles or to abstract cluster-specific knowledge.`, + } +} + +// NewCmdUsr creates the "usr" command +func NewCmdUsr() *cobra.Command { + return &cobra.Command{ + Use: "usr", + Short: "manage users", + Long: `A user stores the grants and credentials of user of the agent API. + +User objects are not necessary with OpenID authentication, as the +grants are embedded in the trusted bearer tokens.`, + } +} + +// NewCmdVol creates the "vol" command +func NewCmdVol() *cobra.Command { + return &cobra.Command{ + Use: "vol", + Short: "manage volumes", + Long: `A volume is a persistent data provider. + +A volume is made of disk, fs and sync resources. It is created by a pool, +to satisfy a demand from a volume resource in a service. + +Volumes and their subdirectories can be mounted inside containers.`, + } +} + +// NewCmdNscfg creates the "nscfg" command +func NewCmdNscfg() *cobra.Command { + return &cobra.Command{ + Use: "nscfg", + Short: "manage namespace configurations", + } +} + +// NewCmdNetwork creates the "network" command +func NewCmdNetwork() *cobra.Command { + return &cobra.Command{ + Use: "network", + Short: "manage backend networks", + Aliases: []string{"net"}, + Long: "A backend network provides ip addresses to svc objects via ip.cni resources. These addresses are automatically allocated, accessible from all cluster nodes, and resolved by the cluster dns.", + } +} + +// NewCmdNetworkIP creates the "ip" subcommand for network +func NewCmdNetworkIP() *cobra.Command { + return &cobra.Command{ + Use: "ip", + Short: "manage ip on backend networks", + } +} + +// NewCmdPool creates the "pool" command +func NewCmdPool() *cobra.Command { + return &cobra.Command{ + Use: "pool", + Short: "manage storage pools", + Long: " A pool is a vol provider. Pools abstract the hardware and software specificities of the cluster infrastructure.", + } +} + +// NewCmdPoolVolume creates the "volume" subcommand for pool +func NewCmdPoolVolume() *cobra.Command { + return &cobra.Command{ + Use: "volume", + Short: "manage storage pool volumes", + Aliases: []string{"vol"}, + } +} + +// NewCmdNodeCapabilities creates the "capabilities" subcommand for node +func NewCmdNodeCapabilities() *cobra.Command { + return &cobra.Command{ + GroupID: GroupIDSubsystems, + Use: "capabilities", + Short: "scan and list what the node is capable of", + Aliases: []string{"capa", "caps", "cap"}, + } +} + +// NewCmdNodeCollector creates the "collector" subcommand for node +func NewCmdNodeCollector() *cobra.Command { + return &cobra.Command{ + GroupID: GroupIDSubsystems, + Use: "collector", + Short: "node collector data management commands", + } +} + +// NewCmdNodeCollectorTag creates the "tag" subcommand for node collector +func NewCmdNodeCollectorTag() *cobra.Command { + return &cobra.Command{ + GroupID: GroupIDSubsystems, + Use: "tag", + Short: "collector tags management commands", + } +} + +// NewCmdNodeCompliance creates the "compliance" subcommand for node +func NewCmdNodeCompliance() *cobra.Command { + return &cobra.Command{ + GroupID: GroupIDSubsystems, + Use: "compliance", + Short: "node configuration manager commands", + } +} + +// NewCmdNodeSCSI creates the "scsi" subcommand for node +func NewCmdNodeSCSI() *cobra.Command { + return &cobra.Command{ + GroupID: GroupIDSubsystems, + Use: "scsi", + Short: "scsi commands", + } +} + +// NewCmdNodeRelay creates the "relay" subcommand for node +func NewCmdNodeRelay() *cobra.Command { + return &cobra.Command{ + GroupID: GroupIDSubsystems, + Use: "relay", + Short: "relay commands", + } +} + +// NewCmdNodeSSH creates the "ssh" subcommand for node +func NewCmdNodeSSH() *cobra.Command { + return &cobra.Command{ + GroupID: GroupIDSubsystems, + Use: "ssh", + Short: "ssh commands", + } +} diff --git a/core/commoncmd/flags_global.go b/core/commoncmd/flags_global.go new file mode 100644 index 000000000..42aac9bb8 --- /dev/null +++ b/core/commoncmd/flags_global.go @@ -0,0 +1,26 @@ +package commoncmd + +import ( + "github.com/spf13/pflag" +) + +// AddFlagsGlobal adds the global flags to the flag set. +// This is the common implementation used by both om and ox. +func AddFlagsGlobal(flags *pflag.FlagSet, p *OptsGlobal) { + FlagColor(flags, &p.Color) + FlagOutput(flags, &p.Output) + FlagObjectSelector(flags, &p.ObjectSelector) + FlagIgnoreNotFound(flags, &p.IgnoreNotFound) +} + +// AddFlagsGlobalWithColorOutput adds color and output flags +func AddFlagsGlobalWithColorOutput(flags *pflag.FlagSet, color, output *string) { + FlagColor(flags, color) + FlagOutput(flags, output) +} + +// AddFlagsGlobalWithSelector adds object selector and ignore not found flags +func AddFlagsGlobalWithSelector(flags *pflag.FlagSet, objectSelector *string, ignoreNotFound *bool) { + FlagObjectSelector(flags, objectSelector) + FlagIgnoreNotFound(flags, ignoreNotFound) +} \ No newline at end of file diff --git a/core/commoncmd/groups.go b/core/commoncmd/groups.go index 8d801dc79..030523fa7 100644 --- a/core/commoncmd/groups.go +++ b/core/commoncmd/groups.go @@ -6,6 +6,7 @@ var ( GroupIDOrchestratedActions = "orchestrated actions" GroupIDQuery = "query" GroupIDSubsystems = "subsystems" + GroupIDResourceGroups = "resource groups" ) func NewGroupOrchestratedActions() *cobra.Group { @@ -28,3 +29,10 @@ func NewGroupSubsystems() *cobra.Group { Title: "Subsystems:", } } + +func NewGroupResources() *cobra.Group { + return &cobra.Group{ + ID: GroupIDResourceGroups, + Title: "Resource Groups:", + } +} diff --git a/core/commoncmd/main.go b/core/commoncmd/main.go index 4af898f75..214b77856 100644 --- a/core/commoncmd/main.go +++ b/core/commoncmd/main.go @@ -30,6 +30,7 @@ type ( Color string Output string ObjectSelector string + IgnoreNotFound bool } OptsNodeGlobal struct { diff --git a/core/commoncmd/object.go b/core/commoncmd/object.go index 75f10373f..301d4b1f5 100644 --- a/core/commoncmd/object.go +++ b/core/commoncmd/object.go @@ -17,7 +17,7 @@ func NewCmdObjectCompliance(kind string) *cobra.Command { GroupID: GroupIDSubsystems, Use: "compliance", Short: "analyze, enforce node configuration compliance", - Aliases: []string{"compli", "comp", "com", "co"}, + Aliases: []string{"comp"}, } } @@ -25,15 +25,76 @@ func NewCmdObjectConfig(kind string) *cobra.Command { return &cobra.Command{ GroupID: GroupIDSubsystems, Use: "config", - Short: "show, alter object configuration", + Aliases: []string{"conf", "cf", "cfg"}, + Short: "show, edit, update, ...", } } func NewCmdObjectContainer(kind string) *cobra.Command { return &cobra.Command{ - GroupID: GroupIDSubsystems, + GroupID: GroupIDResourceGroups, Use: "container", - Short: "enter, stream logs", + Short: "list, start, stop, enter, logs, ...", + } +} + +func NewCmdObjectIP(kind string) *cobra.Command { + return &cobra.Command{ + GroupID: GroupIDResourceGroups, + Use: "ip", + Short: "list, start, stop, ...", + Aliases: []string{"ipaddr", "address"}, + } +} + +func NewCmdObjectFS(kind string) *cobra.Command { + return &cobra.Command{ + GroupID: GroupIDResourceGroups, + Use: "fs", + Short: "list, start, stop, ...", + Aliases: []string{"filesystem"}, + } +} + +func NewCmdObjectVolume(kind string) *cobra.Command { + return &cobra.Command{ + GroupID: GroupIDResourceGroups, + Use: "volume", + Short: "list, start, stop, ...", + Aliases: []string{"vol"}, + } +} + +func NewCmdObjectDisk(kind string) *cobra.Command { + return &cobra.Command{ + GroupID: GroupIDResourceGroups, + Use: "disk", + Short: "list, start, stop, ...", + } +} + +func NewCmdObjectShare(kind string) *cobra.Command { + return &cobra.Command{ + GroupID: GroupIDResourceGroups, + Use: "share", + Short: "list, start, stop, ...", + } +} + +func NewCmdObjectApp(kind string) *cobra.Command { + return &cobra.Command{ + GroupID: GroupIDResourceGroups, + Use: "app", + Short: "list, start, stop, ...", + Aliases: []string{"application"}, + } +} + +func NewCmdObjectTask(kind string) *cobra.Command { + return &cobra.Command{ + GroupID: GroupIDResourceGroups, + Use: "task", + Short: "list, run, ...", } } @@ -41,8 +102,8 @@ func NewCmdObjectInstance(kind string) *cobra.Command { cmd := &cobra.Command{ GroupID: GroupIDSubsystems, Use: "instance", - Short: "query, action object instances", - Aliases: []string{"inst", "in"}, + Short: "list, start, stop, ...", + Aliases: []string{"inst"}, } cmd.AddGroup( NewGroupQuery(), @@ -82,9 +143,10 @@ func NewCmdObjectSSH(kind string) *cobra.Command { func NewCmdObjectSync(kind string) *cobra.Command { return &cobra.Command{ - GroupID: GroupIDSubsystems, + GroupID: GroupIDResourceGroups, Use: "sync", - Hidden: true, + Short: "list, update, ...", + Long: "Replicate instance data, execute sync actions, list sync resources.", Aliases: []string{"syn", "sy"}, } } @@ -97,31 +159,35 @@ func NewCmdObjectInstanceSync(kind string) *cobra.Command { } } -func NewCmdObjectResource(kind string) *cobra.Command { - return &cobra.Command{ +func NewCmdObjectResourceSync(kind string) *cobra.Command { + cmd := &cobra.Command{ GroupID: GroupIDSubsystems, - Use: "resource", - Short: "query object instance resources", - Aliases: []string{"res"}, + Use: "sync", + Short: "replicate object instance data", } + cmd.AddGroup( + NewGroupSubsystems(), + ) + return cmd } -func NewCmdObjectInstanceResource(kind string) *cobra.Command { +func NewCmdObjectResource(kind string) *cobra.Command { cmd := &cobra.Command{ GroupID: GroupIDSubsystems, Use: "resource", - Short: "query, push instance resources", + Short: "list, start, stop, ...", + Aliases: []string{"res"}, } cmd.AddGroup( + NewGroupQuery(), NewGroupSubsystems(), ) return cmd } -func NewCmdObjectInstanceResourceInfo(kind string) *cobra.Command { +func NewCmdObjectResourceInfo(kind string) *cobra.Command { return &cobra.Command{ - GroupID: GroupIDSubsystems, - Use: "info", - Short: "list, push the key-values reported by resources", + Use: "info", + Short: "list, push the key-values reported by resources", } } diff --git a/core/instance/config.go b/core/instance/config.go index 8387c6139..0f1aad64f 100644 --- a/core/instance/config.go +++ b/core/instance/config.go @@ -1,6 +1,7 @@ package instance import ( + "maps" "time" "github.com/opensvc/om3/v3/core/naming" @@ -8,6 +9,7 @@ import ( "github.com/opensvc/om3/v3/core/priority" "github.com/opensvc/om3/v3/core/schedule" "github.com/opensvc/om3/v3/core/topology" + "github.com/opensvc/om3/v3/util/label" "github.com/opensvc/om3/v3/util/stringslice" "github.com/opensvc/om3/v3/util/xmap" ) @@ -21,6 +23,7 @@ type ( Priority priority.T `json:"priority"` Scope []string `json:"scope"` UpdatedAt time.Time `json:"updated_at"` + Labels label.M `json:"labels,omitempty"` *ActorConfig *VolConfig @@ -96,6 +99,7 @@ func (cfg *Config) DeepCopy() *Config { newCfg.Scope = append([]string{}, cfg.Scope...) newCfg.ActorConfig = cfg.ActorConfig.DeepCopy() newCfg.VolConfig = cfg.VolConfig.DeepCopy() + newCfg.Labels = cfg.Labels.DeepCopy() return &newCfg } @@ -131,6 +135,9 @@ func ConfigEqual(a, b *Config) bool { if !stringslice.Equal(a.Scope, b.Scope) { return false } + if !maps.Equal(a.Labels, b.Labels) { + return false + } return true } diff --git a/core/object/actor_container_logs.go b/core/object/actor_container_logs.go index 508d0e6eb..e61068eb9 100644 --- a/core/object/actor_container_logs.go +++ b/core/object/actor_container_logs.go @@ -20,7 +20,7 @@ func (t *actor) ContainerLogs(ctx context.Context, rid string, follow bool, line if i, ok := r.(containerLogger); !ok { continue } else if container != nil { - return fmt.Errorf("multiple resources support container logs. use the --rid option") + return fmt.Errorf("multiple resources support container logs. specify a container id") } else { container = i rid = r.RID() @@ -51,7 +51,7 @@ func (t *actor) ContainerLogsStream(ctx context.Context, rid string, follow bool if i, ok := r.(containerLogger); !ok { continue } else if container != nil { - return nil, fmt.Errorf("multiple resources support container logs. use the --rid option") + return nil, fmt.Errorf("multiple resources support container logs. specify a container id") } else { container = i rid = r.RID() diff --git a/core/object/actor_enter.go b/core/object/actor_enter.go index 2a86378af..8e673ccc5 100644 --- a/core/object/actor_enter.go +++ b/core/object/actor_enter.go @@ -19,7 +19,7 @@ func (t *actor) Enter(ctx context.Context, rid string) error { if i, ok := r.(enterer); !ok { continue } else if container != nil { - return fmt.Errorf("multiple resources support enter. use the --rid option") + return fmt.Errorf("multiple resources support enter. specify a container id") } else { container = i rid = r.RID() diff --git a/core/object/core_keywords.go b/core/object/core_keywords.go index b51853268..d4e06945a 100644 --- a/core/object/core_keywords.go +++ b/core/object/core_keywords.go @@ -571,6 +571,7 @@ var keywordStore = keywords.Store{ Example: "2h", Kind: naming.NewKinds(naming.KindSvc, naming.KindVol), Option: "timeout", + Section: "DEFAULT", Scopable: true, Text: keywords.NewText(fs, "text/kw/core/timeout"), }, @@ -581,6 +582,7 @@ var keywordStore = keywords.Store{ Example: "10s", Kind: naming.NewKinds(naming.KindSvc, naming.KindVol), Option: "status_timeout", + Section: "DEFAULT", Scopable: true, Text: keywords.NewText(fs, "text/kw/core/status_timeout"), }, @@ -590,6 +592,7 @@ var keywordStore = keywords.Store{ Example: "1m30s", Kind: naming.NewKinds(naming.KindSvc, naming.KindVol), Option: "start_timeout", + Section: "DEFAULT", Scopable: true, Text: keywords.NewText(fs, "text/kw/core/start_timeout"), }, @@ -599,6 +602,7 @@ var keywordStore = keywords.Store{ Example: "1m30s", Kind: naming.NewKinds(naming.KindSvc, naming.KindVol), Option: "stop_timeout", + Section: "DEFAULT", Scopable: true, Text: keywords.NewText(fs, "text/kw/core/stop_timeout"), }, @@ -608,6 +612,7 @@ var keywordStore = keywords.Store{ Default: "true", Kind: naming.NewKinds(naming.KindSvc, naming.KindVol), Option: "provision", + Section: "DEFAULT", Scopable: true, Text: keywords.NewText(fs, "text/kw/core/provision"), }, @@ -617,6 +622,7 @@ var keywordStore = keywords.Store{ Default: "true", Kind: naming.NewKinds(naming.KindSvc, naming.KindVol), Option: "unprovision", + Section: "DEFAULT", Scopable: true, Text: keywords.NewText(fs, "text/kw/core/unprovision"), }, @@ -626,6 +632,7 @@ var keywordStore = keywords.Store{ Example: "1m30s", Kind: naming.NewKinds(naming.KindSvc, naming.KindVol), Option: "provision_timeout", + Section: "DEFAULT", Scopable: true, Text: keywords.NewText(fs, "text/kw/core/provision_timeout"), }, @@ -635,6 +642,7 @@ var keywordStore = keywords.Store{ Example: "1m30s", Kind: naming.NewKinds(naming.KindSvc, naming.KindVol), Option: "unprovision_timeout", + Section: "DEFAULT", Scopable: true, Text: keywords.NewText(fs, "text/kw/core/unprovision_timeout"), }, @@ -644,6 +652,7 @@ var keywordStore = keywords.Store{ Example: "1m30s", Kind: naming.NewKinds(naming.KindSvc, naming.KindVol), Option: "sync_timeout", + Section: "DEFAULT", Scopable: true, Text: keywords.NewText(fs, "text/kw/core/sync_timeout"), }, @@ -654,6 +663,7 @@ var keywordStore = keywords.Store{ Inherit: keywords.InheritHead, Kind: naming.NewKinds(naming.KindVol), Option: "access", + Section: "DEFAULT", Scopable: true, Text: keywords.NewText(fs, "text/kw/core/access"), }, @@ -663,6 +673,7 @@ var keywordStore = keywords.Store{ Kind: naming.NewKinds(naming.KindVol), Option: "devices_from", Converter: "list", + Section: "DEFAULT", Text: keywords.NewText(fs, "text/kw/core/devices_from"), }, { @@ -671,6 +682,7 @@ var keywordStore = keywords.Store{ Inherit: keywords.InheritHead, Kind: naming.NewKinds(naming.KindVol), Option: "size", + Section: "DEFAULT", Scopable: true, Text: keywords.NewText(fs, "text/kw/core/size"), }, @@ -679,6 +691,7 @@ var keywordStore = keywords.Store{ Inherit: keywords.InheritHead, Kind: naming.NewKinds(naming.KindVol), Option: "pool", + Section: "DEFAULT", Scopable: true, Text: keywords.NewText(fs, "text/kw/core/pool"), }, diff --git a/core/object/node_keywords.go b/core/object/node_keywords.go index 43a07c472..05b5626ab 100644 --- a/core/object/node_keywords.go +++ b/core/object/node_keywords.go @@ -1209,6 +1209,7 @@ var ( Converter: "int", Default: "1024", Deprecated: "3.0.0", + ReplacedBy: "mask_per_node", Option: "ips_per_node", Section: "network", Text: keywords.NewText(fs, "text/kw/node/network.routed_bridge.ips_per_node"), diff --git a/core/om/factory.go b/core/om/factory.go index 7c1de818d..88e86e622 100644 --- a/core/om/factory.go +++ b/core/om/factory.go @@ -14,111 +14,6 @@ import ( "github.com/opensvc/om3/v3/util/hostname" ) -func newCmdAll() *cobra.Command { - return &cobra.Command{ - Use: "all", - Short: "manage a mix of objects, tentatively exposing all commands", - } -} - -func newCmdCcfg() *cobra.Command { - return &cobra.Command{ - Use: "ccfg", - Short: "manage the cluster shared configuration", - Long: `The cluster nodes merge their private configuration -over the cluster shared configuration. - -The shared configuration is hosted in a ccfg-kind object, and is -replicated using the same rules as other kinds of object (last write is -eventually replicated). -`, - } -} - -func newCmdCfg() *cobra.Command { - return &cobra.Command{ - Use: "cfg", - Short: "manage configmaps", - Long: `A configmap is an unencrypted key-value store. - -Values can be binary or text. - -A key can be installed as a file in a Vol, then exposed to apps -and containers. - -A key can be exposed as a environment variable for apps and -containers. - -A signal can be sent to consumer processes upon exposed key value -changes. - -The key names can include the '/' character, interpreted as a path separator -when installing the key in a volume.`, - } -} - -func newCmdSec() *cobra.Command { - return &cobra.Command{ - Use: "sec", - Short: "manage secrets", - Long: `A secret is an encrypted key-value store. - -Values can be binary or text. - -A key can be installed as a file in a Vol, then exposed to apps -and containers. - -A key can be exposed as a environment variable for apps and -containers. - -A signal can be sent to consumer processes upon exposed key value -changes. - -The key names can include the '/' character, interpreted as a path separator -when installing the key in a volume.`, - } -} - -func newCmdSVC() *cobra.Command { - return &cobra.Command{ - Use: "svc", - Short: "manage services", - Long: `Service objects subsystem. - -A service is typically made of ip, app, container and task resources. - -They can use support objects like volumes, secrets and configmaps to -isolate lifecycles or to abstract cluster-specific knowledge. -`, - } -} - -func newCmdVol() *cobra.Command { - return &cobra.Command{ - Use: "vol", - Short: "manage volumes", - Long: `A volume is a persistent data provider. - -A volume is made of disk, fs and sync resources. It is created by a pool, -to satisfy a demand from a volume resource in a service. - -Volumes and their subdirectories can be mounted inside containers. - -A volume can host cfg and sec keys projections.`, - } -} - -func newCmdUsr() *cobra.Command { - return &cobra.Command{ - Use: "usr", - Short: "manage users", - Long: `A user stores the grants and credentials of user of the agent API. - -User objects are not necessary with OpenID authentication, as the -grants are embedded in the trusted bearer tokens.`, - } -} - func newCmdArrayList() *cobra.Command { var options commands.CmdArrayList cmd := &cobra.Command{ @@ -183,7 +78,7 @@ func newCmdDaemonEvents() *cobra.Command { Use: "events", Short: "print the daemon event stream", Long: "Print the daemon event stream\n\n" + commoncmd.UsageFlagEventFilter() + "\n" + commoncmd.UsageFlagEventTemplate(), - Aliases: []string{"eve", "even", "event"}, + Aliases: []string{"ev"}, RunE: func(cmd *cobra.Command, args []string) error { if options.Wait && !cmd.Flags().Changed("limit") { options.Limit = 1 @@ -208,10 +103,9 @@ func newCmdDaemonEvents() *cobra.Command { func newCmdDaemonRestart() *cobra.Command { var options commands.CmdDaemonRestart cmd := &cobra.Command{ - Use: "restart", - Short: "restart the daemon", - Long: "restart the daemon. Operation is asynchronous when node selector is used", - Aliases: []string{"restart"}, + Use: "restart", + Short: "restart the daemon", + Long: "restart the daemon. Operation is asynchronous when node selector is used", RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -226,10 +120,9 @@ func newCmdDaemonRestart() *cobra.Command { func newCmdDaemonRun() *cobra.Command { var options commands.CmdDaemonRun cmd := &cobra.Command{ - Use: "run", - Short: "run the daemon in foreground", - Long: "Start executes a detached run", - Aliases: []string{"star"}, + Use: "run", + Short: "run the daemon in foreground", + Long: "Start executes a detached run", RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -275,9 +168,8 @@ func newCmdDaemonShutdown() *cobra.Command { func newCmdDaemonStart() *cobra.Command { var options commands.CmdDaemonStart cmd := &cobra.Command{ - Use: "start", - Short: "start the daemon or a daemon subsystem", - Aliases: []string{"star"}, + Use: "start", + Short: "start the daemon or a daemon subsystem", RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -576,7 +468,7 @@ func newCmdNodeChecks() *cobra.Command { cmd := &cobra.Command{ Use: "checks", Short: "run the checks, push and print the result", - Aliases: []string{"check", "chec", "che", "ch"}, + Aliases: []string{"check", "chk"}, RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -607,10 +499,9 @@ func newCmdNodeCollectorTagAttach() *cobra.Command { var attachData string var options commands.CmdNodeCollectorTagAttach cmd := &cobra.Command{ - Use: "attach", - Short: "attach a tag to this node", - Long: "The tag must already exist in the collector.", - Aliases: []string{"atta", "att", "at", "a"}, + Use: "attach", + Short: "attach a tag to this node", + Long: "The tag must already exist in the collector.", RunE: func(cmd *cobra.Command, args []string) error { if cmd.Flag("attach-data").Changed { options.AttachData = &attachData @@ -655,9 +546,8 @@ func newCmdNodeCollectorTagCreate() *cobra.Command { func newCmdNodeCollectorTagDetach() *cobra.Command { var options commands.CmdNodeCollectorTagDetach cmd := &cobra.Command{ - Use: "detach", - Short: "detach a tag from this node", - Aliases: []string{"deta", "det", "de", "d"}, + Use: "detach", + Short: "detach a tag from this node", RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -704,7 +594,7 @@ func newCmdNodeComplianceAttachModuleset() *cobra.Command { Use: "moduleset", Short: "attach modulesets to this node", Long: "Modules of all attached modulesets are checked on schedule.", - Aliases: []string{"modulese", "modules", "module", "modul", "modu", "mod", "mo"}, + Aliases: []string{"modset"}, RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -719,10 +609,9 @@ func newCmdNodeComplianceAttachModuleset() *cobra.Command { func newCmdNodeComplianceAttachRuleset() *cobra.Command { var options commands.CmdNodeComplianceAttachRuleset cmd := &cobra.Command{ - Use: "ruleset", - Short: "attach rulesets to this node", - Long: "Rules of attached rulesets are exposed to modules.", - Aliases: []string{"rulese", "rules", "rule", "rul", "ru"}, + Use: "ruleset", + Short: "attach rulesets to this node", + Long: "Rules of attached rulesets are exposed to modules.", RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -759,7 +648,7 @@ func newCmdNodeComplianceCheck() *cobra.Command { cmd := &cobra.Command{ Use: "check", Short: "run modules checks", - Aliases: []string{"chec", "che", "ch"}, + Aliases: []string{"chk"}, RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -796,9 +685,8 @@ func newCmdNodeComplianceFix() *cobra.Command { func newCmdNodeComplianceFixable() *cobra.Command { var options commands.CmdNodeComplianceFixable cmd := &cobra.Command{ - Use: "fixable", - Short: "run modules fixable-tests", - Aliases: []string{"fixabl", "fixab", "fixa"}, + Use: "fixable", + Short: "run modules fixable-tests", RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -819,7 +707,7 @@ func newCmdNodeComplianceDetachModuleset() *cobra.Command { Use: "moduleset", Short: "detach modulesets from this node", Long: "Modules of attached modulesets are checked on schedule.", - Aliases: []string{"modulese", "modules", "module", "modul", "modu", "mod", "mo"}, + Aliases: []string{"modset"}, RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -834,10 +722,9 @@ func newCmdNodeComplianceDetachModuleset() *cobra.Command { func newCmdNodeComplianceDetachRuleset() *cobra.Command { var options commands.CmdNodeComplianceDetachRuleset cmd := &cobra.Command{ - Use: "ruleset", - Short: "detach rulesets from this node", - Long: "Rules of attached rulesets are made available to their module.", - Aliases: []string{"rulese", "rules", "rule", "rul", "ru"}, + Use: "ruleset", + Short: "detach rulesets from this node", + Long: "Rules of attached rulesets are made available to their module.", RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -852,9 +739,8 @@ func newCmdNodeComplianceDetachRuleset() *cobra.Command { func newCmdNodeComplianceEnv() *cobra.Command { var options commands.CmdNodeComplianceEnv cmd := &cobra.Command{ - Use: "env", - Short: "show the env variables set for modules run", - Aliases: []string{"en"}, + Use: "env", + Short: "show the env variables set for modules run", RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -870,9 +756,9 @@ func newCmdNodeComplianceEnv() *cobra.Command { func newCmdNodeComplianceListModules() *cobra.Command { var options commands.CmdNodeComplianceListModules cmd := &cobra.Command{ - Use: "modules", + Use: "module", Short: "list modules available on this node", - Aliases: []string{"module", "modul", "modu", "mod"}, + Aliases: []string{"mod", "modules"}, RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -888,7 +774,7 @@ func newCmdNodeComplianceListModuleset() *cobra.Command { cmd := &cobra.Command{ Use: "moduleset", Short: "list modulesets available to this node", - Aliases: []string{"modulesets"}, + Aliases: []string{"modset"}, RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -903,9 +789,8 @@ func newCmdNodeComplianceListModuleset() *cobra.Command { func newCmdNodeComplianceListRuleset() *cobra.Command { var options commands.CmdNodeComplianceListRuleset cmd := &cobra.Command{ - Use: "ruleset", - Short: "list rulesets available to this node", - Aliases: []string{"rulese", "rules", "rule", "rul", "ru"}, + Use: "ruleset", + Short: "list rulesets available to this node", RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -922,7 +807,7 @@ func newCmdNodeComplianceShowModuleset() *cobra.Command { cmd := &cobra.Command{ Use: "moduleset", Short: "show modulesets and modules attached to this node", - Aliases: []string{"modulese", "modules", "module", "modul", "modu", "mod", "mo"}, + Aliases: []string{"modset"}, RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -937,9 +822,8 @@ func newCmdNodeComplianceShowModuleset() *cobra.Command { func newCmdNodeComplianceShowRuleset() *cobra.Command { var options commands.CmdNodeComplianceShowRuleset cmd := &cobra.Command{ - Use: "ruleset", - Short: "show rules contextualized for this node", - Aliases: []string{"rulese", "rules", "rule", "rul", "ru"}, + Use: "ruleset", + Short: "show rules contextualized for this node", RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -990,7 +874,7 @@ func newCmdNodeEdit() *cobra.Command { Use: "edit", Short: "edit the node configuration", Hidden: true, - Aliases: []string{"ed", "edi"}, + Aliases: []string{"ed"}, RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -1026,7 +910,7 @@ func newCmdNodeEditConfig() *cobra.Command { cmd := &cobra.Command{ Use: "config", Short: "edit the node configuration", - Aliases: []string{"conf", "co", "cf", "cfg"}, + Aliases: []string{"conf", "cf", "cfg"}, Hidden: true, RunE: func(cmd *cobra.Command, args []string) error { return options.Run() @@ -1122,7 +1006,7 @@ func newCmdNodeLogs() *cobra.Command { cmd := &cobra.Command{ GroupID: commoncmd.GroupIDQuery, Use: "logs", - Aliases: []string{"logs", "log", "lo"}, + Aliases: []string{"log"}, Short: "show this node logs", RunE: func(cmd *cobra.Command, args []string) error { return options.Run() @@ -1157,9 +1041,8 @@ func newCmdNodeList() *cobra.Command { func newCmdNodeSCSIPRKey() *cobra.Command { var options commands.CmdNodePRKey cmd := &cobra.Command{ - Use: "prkey", - Short: "show the scsi3 persistent reservation key of this node", - Aliases: []string{"prk", "prke"}, + Use: "prkey", + Short: "show the scsi3 persistent reservation key of this node", RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -1221,10 +1104,9 @@ func newCmdNodeScheduleList() *cobra.Command { func newCmdNodePushasset() *cobra.Command { var options commands.CmdNodePushAsset cmd := &cobra.Command{ - Use: "pushasset", - Hidden: true, - Short: "run the node discovery, push and print the result", - Aliases: []string{"pushasse", "pushass", "pushas"}, + Use: "pushasset", + Hidden: true, + Short: "run the node discovery, push and print the result", RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -1239,9 +1121,8 @@ func newCmdNodePushasset() *cobra.Command { func newCmdNodePushAsset() *cobra.Command { var options commands.CmdNodePushAsset cmd := &cobra.Command{ - Use: "asset", - Short: "run the node discovery, push and print the result", - Aliases: []string{"asse", "ass", "as"}, + Use: "asset", + Short: "run the node discovery, push and print the result", RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -1261,7 +1142,7 @@ func newCmdNodePushdisk() *cobra.Command { Use: "pushdisk", Hidden: true, Short: "run the disk discovery, push and print the result", - Aliases: []string{"pushdisks", "pushdis", "psuhdi"}, + Aliases: []string{"pushdisks"}, RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -1278,7 +1159,7 @@ func newCmdNodePushDisk() *cobra.Command { cmd := &cobra.Command{ Use: "disk", Short: "run the disk discovery, push and print the result", - Aliases: []string{"disks", "dis", "di"}, + Aliases: []string{"disks"}, RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -1295,10 +1176,9 @@ func newCmdNodePushDisk() *cobra.Command { func newCmdNodePushpkg() *cobra.Command { var options commands.CmdNodePushPkg cmd := &cobra.Command{ - Use: "pushpkg", - Hidden: true, - Short: "run the node installed packages discovery, push and print the result", - Aliases: []string{"pushpk"}, + Use: "pushpkg", + Hidden: true, + Short: "run the node installed packages discovery, push and print the result", RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -1313,9 +1193,8 @@ func newCmdNodePushpkg() *cobra.Command { func newCmdNodePushPkg() *cobra.Command { var options commands.CmdNodePushPkg cmd := &cobra.Command{ - Use: "pkg", - Short: "run the node installed packages discovery, push and print the result", - Aliases: []string{"pk"}, + Use: "pkg", + Short: "run the node installed packages discovery, push and print the result", RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -1335,7 +1214,7 @@ func newCmdNodeRegister() *cobra.Command { Use: "register", Short: "initial login on the collector", Long: "Obtain a registration id from the collector, store it in the node configuration node.uuid keyword. This uuid is then used to authenticate the node in collector communications.", - Aliases: []string{"registe", "regist", "regis", "regi", "reg", "re"}, + Aliases: []string{"reg"}, RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -1401,10 +1280,9 @@ over a service declaring stonith=true`, func newCmdNodeSysreport() *cobra.Command { var options commands.CmdNodeSysreport cmd := &cobra.Command{ - Use: "sysreport", - Short: "collect system data and push it to the collector", - Long: "Push system report to the collector for archiving and diff analysis. The --force option resend all monitored files and outputs to the collector instead of only those that changed since the last sysreport.", - Aliases: []string{"sysrepor", "sysrepo", "sysrep", "sysre", "sysr", "sys", "sy"}, + Use: "sysreport", + Short: "collect system data and push it to the collector", + Long: "Push system report to the collector for archiving and diff analysis. The --force option resend all monitored files and outputs to the collector instead of only those that changed since the last sysreport.", RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -1456,7 +1334,7 @@ func newCmdNodeValidateConfig() *cobra.Command { cmd := &cobra.Command{ Use: "config", Short: "verify the node configuration syntax", - Aliases: []string{"conf", "co", "cf", "cfg"}, + Aliases: []string{"conf", "cf", "cfg"}, RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -1565,9 +1443,8 @@ func newCmdObjectCertificatePKCS(kind string) *cobra.Command { func newCmdObjectPrint(kind string) *cobra.Command { cmd := &cobra.Command{ - Use: "print", - Short: "print information about the object", - Aliases: []string{"prin", "pri", "pr"}, + Use: "print", + Short: "print information about the object", } cmd.AddGroup( commoncmd.NewGroupQuery(), @@ -1577,9 +1454,8 @@ func newCmdObjectPrint(kind string) *cobra.Command { func newCmdObjectPush(kind string) *cobra.Command { return &cobra.Command{ - Use: "push", - Short: "push information about the object to the collector", - Aliases: []string{"push", "pus", "pu"}, + Use: "push", + Short: "push information about the object to the collector", } } @@ -1594,10 +1470,9 @@ func newCmdObjectCollectorTagAttach(kind string) *cobra.Command { var attachData string var options commands.CmdObjectCollectorTagAttach cmd := &cobra.Command{ - Use: "attach", - Short: "attach a tag to this node", - Long: "The tag must already exist in the collector.", - Aliases: []string{"atta", "att", "at", "a"}, + Use: "attach", + Short: "attach a tag to this node", + Long: "The tag must already exist in the collector.", RunE: func(cmd *cobra.Command, args []string) error { if cmd.Flag("attach-data").Changed { options.AttachData = &attachData @@ -1642,9 +1517,8 @@ func newCmdObjectCollectorTagCreate(kind string) *cobra.Command { func newCmdObjectCollectorTagDetach(kind string) *cobra.Command { var options commands.CmdObjectCollectorTagDetach cmd := &cobra.Command{ - Use: "detach", - Short: "detach a tag from this node", - Aliases: []string{"deta", "det", "de", "d"}, + Use: "detach", + Short: "detach a tag from this node", RunE: func(cmd *cobra.Command, args []string) error { return options.Run(kind) }, @@ -1687,17 +1561,15 @@ func newCmdObjectCollectorTagShow(kind string) *cobra.Command { func newCmdObjectComplianceAttach(kind string) *cobra.Command { return &cobra.Command{ - Use: "attach", - Short: "attach modulesets and rulesets to the node", - Aliases: []string{"attac", "atta", "att", "at"}, + Use: "attach", + Short: "attach modulesets and rulesets to the node", } } func newCmdObjectComplianceDetach(kind string) *cobra.Command { return &cobra.Command{ - Use: "detach", - Short: "detach modulesets and rulesets from the node", - Aliases: []string{"detac", "deta", "det", "de"}, + Use: "detach", + Short: "detach modulesets and rulesets from the node", } } @@ -1776,7 +1648,7 @@ func newCmdObjectEditConfig(kind string) *cobra.Command { Use: "config", Short: "edit selected object and instance configuration", Hidden: true, - Aliases: []string{"conf", "co", "cf", "cfg"}, + Aliases: []string{"conf", "cf", "cfg"}, RunE: func(cmd *cobra.Command, args []string) error { return options.Run(kind) }, @@ -1795,7 +1667,7 @@ func newCmdObjectComplianceAttachModuleset(kind string) *cobra.Command { Use: "moduleset", Short: "attach modulesets to this object", Long: "Modules of attached modulesets are checked on schedule.", - Aliases: []string{"modulese", "modules", "module", "modul", "modu", "mod", "mo"}, + Aliases: []string{"modset"}, RunE: func(cmd *cobra.Command, args []string) error { return options.Run(kind) }, @@ -1809,10 +1681,9 @@ func newCmdObjectComplianceAttachModuleset(kind string) *cobra.Command { func newCmdObjectComplianceAttachRuleset(kind string) *cobra.Command { var options commands.CmdObjectComplianceAttachRuleset cmd := &cobra.Command{ - Use: "ruleset", - Short: "attach rulesets to this object", - Long: "Rules of attached rulesets are exposed to modules.", - Aliases: []string{"rulese", "rules", "rule", "rul", "ru"}, + Use: "ruleset", + Short: "attach rulesets to this object", + Long: "Rules of attached rulesets are exposed to modules.", RunE: func(cmd *cobra.Command, args []string) error { return options.Run(kind) }, @@ -1848,7 +1719,7 @@ func newCmdObjectComplianceCheck(kind string) *cobra.Command { cmd := &cobra.Command{ Use: "check", Short: "run modules checks", - Aliases: []string{"chec", "che", "ch"}, + Aliases: []string{"chk"}, RunE: func(cmd *cobra.Command, args []string) error { return options.Run(kind) }, @@ -1885,9 +1756,8 @@ func newCmdObjectComplianceFix(kind string) *cobra.Command { func newCmdObjectComplianceFixable(kind string) *cobra.Command { var options commands.CmdObjectComplianceFixable cmd := &cobra.Command{ - Use: "fixable", - Short: "run modules fixable-tests", - Aliases: []string{"fixabl", "fixab", "fixa"}, + Use: "fixable", + Short: "run modules fixable-tests", RunE: func(cmd *cobra.Command, args []string) error { return options.Run(kind) }, @@ -1908,7 +1778,7 @@ func newCmdObjectComplianceDetachModuleset(kind string) *cobra.Command { Use: "moduleset", Short: "detach modulesets from this object", Long: "Modules of attached modulesets are checked on schedule.", - Aliases: []string{"modulese", "modules", "module", "modul", "modu", "mod", "mo"}, + Aliases: []string{"modset"}, RunE: func(cmd *cobra.Command, args []string) error { return options.Run(kind) }, @@ -1922,10 +1792,9 @@ func newCmdObjectComplianceDetachModuleset(kind string) *cobra.Command { func newCmdObjectComplianceDetachRuleset(kind string) *cobra.Command { var options commands.CmdObjectComplianceDetachRuleset cmd := &cobra.Command{ - Use: "ruleset", - Short: "detach rulesets from this object", - Long: "Rules of attached rulesets are made available to their module.", - Aliases: []string{"rulese", "rules", "rule", "rul", "ru"}, + Use: "ruleset", + Short: "detach rulesets from this object", + Long: "Rules of attached rulesets are made available to their module.", RunE: func(cmd *cobra.Command, args []string) error { return options.Run(kind) }, @@ -1939,9 +1808,8 @@ func newCmdObjectComplianceDetachRuleset(kind string) *cobra.Command { func newCmdObjectComplianceEnv(kind string) *cobra.Command { var options commands.CmdObjectComplianceEnv cmd := &cobra.Command{ - Use: "env", - Short: "show the env variables set for a module run", - Aliases: []string{"en"}, + Use: "env", + Short: "show the env variables set for a module run", RunE: func(cmd *cobra.Command, args []string) error { return options.Run(kind) }, @@ -1959,7 +1827,7 @@ func newCmdObjectComplianceListModules(kind string) *cobra.Command { cmd := &cobra.Command{ Use: "modules", Short: "list modules available on this object", - Aliases: []string{"module", "modul", "modu", "mod"}, + Aliases: []string{"mod"}, RunE: func(cmd *cobra.Command, args []string) error { return options.Run(kind) }, @@ -1974,7 +1842,7 @@ func newCmdObjectComplianceListModuleset(kind string) *cobra.Command { cmd := &cobra.Command{ Use: "moduleset", Short: "list modulesets available to this object", - Aliases: []string{"modulesets"}, + Aliases: []string{"modulesets", "modset"}, RunE: func(cmd *cobra.Command, args []string) error { return options.Run(kind) }, @@ -1990,7 +1858,7 @@ func newCmdObjectComplianceListRuleset(kind string) *cobra.Command { cmd := &cobra.Command{ Use: "ruleset", Short: "list rulesets available to this object", - Aliases: []string{"rulese", "rules", "rule", "rul", "ru"}, + Aliases: []string{"rulesets"}, RunE: func(cmd *cobra.Command, args []string) error { return options.Run(kind) }, @@ -2006,7 +1874,7 @@ func newCmdObjectComplianceShowModuleset(kind string) *cobra.Command { cmd := &cobra.Command{ Use: "moduleset", Short: "show modulesets and modules attached to this object", - Aliases: []string{"modulese", "modules", "module", "modul", "modu", "mod", "mo"}, + Aliases: []string{"modset"}, RunE: func(cmd *cobra.Command, args []string) error { return options.Run(kind) }, @@ -2020,9 +1888,8 @@ func newCmdObjectComplianceShowModuleset(kind string) *cobra.Command { func newCmdObjectComplianceShowRuleset(kind string) *cobra.Command { var options commands.CmdObjectComplianceShowRuleset cmd := &cobra.Command{ - Use: "ruleset", - Short: "show rules contextualized for to this object", - Aliases: []string{"rulese", "rules", "rule", "rul", "ru"}, + Use: "ruleset", + Short: "show rules contextualized for to this object", RunE: func(cmd *cobra.Command, args []string) error { return options.Run(kind) }, @@ -2145,10 +2012,16 @@ func newCmdObjectEnable(kind string) *cobra.Command { func newCmdObjectContainerEnter(kind string) *cobra.Command { var options commands.CmdObjectContainerEnter cmd := &cobra.Command{ - Use: "enter", + Use: "enter [ID]", Short: "open a shell in a container resource", - Long: "Enter any container resource if --rid is not set.", + Long: "Enter any container resource. Specify a container ID as a positional argument or let om select the container if unambiguous.", + Args: cobra.MaximumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "container#" + args[0] + } else if options.RID == "" { + options.RID = "container" + } return options.Run(kind) }, } @@ -2161,10 +2034,17 @@ func newCmdObjectContainerEnter(kind string) *cobra.Command { func newCmdObjectContainerLogs(kind string) *cobra.Command { var options commands.CmdObjectContainerLogs cmd := &cobra.Command{ - Use: "logs", + Use: "logs [ID]", Aliases: []string{"log"}, Short: "show container logs", + Long: "Show container logs. Specify a container ID as a positional argument or let om select the container if unambiguous.", + Args: cobra.MaximumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "container#" + args[0] + } else if options.RID == "" { + options.RID = "container" + } return options.Run(kind) }, } @@ -2176,148 +2056,140 @@ func newCmdObjectContainerLogs(kind string) *cobra.Command { return cmd } -func newCmdObjectConfigEval(kind string) *cobra.Command { - var options commands.CmdObjectConfigGet +func newCmdObjectContainerList(kind string) *cobra.Command { + var options commands.CmdObjectResourceList + options.RID = "container" cmd := &cobra.Command{ - Use: "eval", - Short: "evaluate a configuration key value", + Use: "list", + Aliases: []string{"ls"}, + Short: "list container resources", + Long: "List container resources. Equivalent to 'resource ls --rid container'.", RunE: func(cmd *cobra.Command, args []string) error { - options.Eval = true return options.Run(kind) }, } flags := cmd.Flags() addFlagsGlobal(flags, &options.OptsGlobal) - commoncmd.FlagKeywords(flags, &options.Keywords) - commoncmd.FlagImpersonate(flags, &options.Impersonate) - flagLocal(flags, &options.Local) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) return cmd } -func newCmdObjectFreeze(kind string) *cobra.Command { - var options commands.CmdObjectFreeze +func newCmdObjectIPList(kind string) *cobra.Command { + var options commands.CmdObjectResourceList + options.RID = "ip" cmd := &cobra.Command{ - GroupID: commoncmd.GroupIDOrchestratedActions, - Use: "freeze", - Short: "block ha automatic start and monitor action", + Use: "list", + Aliases: []string{"ls"}, + Short: "list ip resources", + Long: "List ip resources. Equivalent to 'resource ls --rid ip'.", RunE: func(cmd *cobra.Command, args []string) error { return options.Run(kind) }, } flags := cmd.Flags() addFlagsGlobal(flags, &options.OptsGlobal) - commoncmd.FlagsAsync(flags, &options.OptsAsync) - commoncmd.HiddenFlagNodeSelector(flags, &options.NodeSelector) - hiddenFlagLocal(flags, &options.Local) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) return cmd } -func newCmdObjectConfigGet(kind string) *cobra.Command { - var options commands.CmdObjectConfigGet +func newCmdObjectFSList(kind string) *cobra.Command { + var options commands.CmdObjectResourceList + options.RID = "fs" cmd := &cobra.Command{ - Use: "get", - Short: "get a configuration key value", + Use: "list", + Aliases: []string{"ls"}, + Short: "list fs resources", + Long: "List fs resources. Equivalent to 'resource ls --rid fs'.", RunE: func(cmd *cobra.Command, args []string) error { return options.Run(kind) }, } flags := cmd.Flags() addFlagsGlobal(flags, &options.OptsGlobal) - commoncmd.FlagEval(flags, &options.Eval) - commoncmd.FlagImpersonate(flags, &options.Impersonate) - commoncmd.FlagKeywords(flags, &options.Keywords) - flagLocal(flags, &options.Local) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) return cmd } -func newCmdObjectGiveback(kind string) *cobra.Command { - var options commands.CmdObjectGiveback +func newCmdObjectVolumeList(kind string) *cobra.Command { + var options commands.CmdObjectResourceList + options.RID = "volume" cmd := &cobra.Command{ - GroupID: commoncmd.GroupIDOrchestratedActions, - Use: "giveback", - Short: "orchestrate to reach optimal placement", - Long: "Stop the misplaced service instances and start on the preferred nodes.", + Use: "list", + Aliases: []string{"ls"}, + Short: "list volume resources", + Long: "List volume resources. Equivalent to 'resource ls --rid volume'.", RunE: func(cmd *cobra.Command, args []string) error { return options.Run(kind) }, } flags := cmd.Flags() addFlagsGlobal(flags, &options.OptsGlobal) - commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) return cmd } -func newCmdObjectLogs(kind string) *cobra.Command { - var options commands.CmdObjectLogs +func newCmdObjectDiskList(kind string) *cobra.Command { + var options commands.CmdObjectResourceList + options.RID = "disk" cmd := &cobra.Command{ - GroupID: commoncmd.GroupIDQuery, - Use: "logs", - Aliases: []string{"logs", "log", "lo"}, - Short: "show object logs", + Use: "list", + Aliases: []string{"ls"}, + Short: "list disk resources", + Long: "List disk resources. Equivalent to 'resource ls --rid disk'.", RunE: func(cmd *cobra.Command, args []string) error { return options.Run(kind) }, } flags := cmd.Flags() addFlagsGlobal(flags, &options.OptsGlobal) - commoncmd.FlagsLogs(flags, &options.OptsLogs) commoncmd.FlagNodeSelector(flags, &options.NodeSelector) - flagLocal(flags, &options.Local) return cmd } -func newCmdObjectList(kind string) *cobra.Command { - var options commands.CmdObjectList +func newCmdObjectShareList(kind string) *cobra.Command { + var options commands.CmdObjectResourceList + options.RID = "share" cmd := &cobra.Command{ - GroupID: commoncmd.GroupIDQuery, Use: "list", - Short: "print the selected objects path", Aliases: []string{"ls"}, + Short: "list share resources", + Long: "List share resources. Equivalent to 'resource ls --rid share'.", RunE: func(cmd *cobra.Command, args []string) error { return options.Run(kind) }, } flags := cmd.Flags() addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) return cmd } -func newCmdObjectConfigShow(kind string) *cobra.Command { - var options commands.CmdObjectConfigShow - cmd := &cobra.Command{ - Use: "show", - Short: "show the object configuration", - RunE: func(cmd *cobra.Command, args []string) error { - return options.Run(kind) - }, - } - flags := cmd.Flags() - commoncmd.FlagObjectSelector(flags, &options.ObjectSelector) - commoncmd.FlagSections(flags, &options.Sections) - return cmd -} - -func newCmdObjectConfigMtime(kind string) *cobra.Command { - var options commands.CmdObjectConfigMtime +func newCmdObjectAppList(kind string) *cobra.Command { + var options commands.CmdObjectResourceList + options.RID = "app" cmd := &cobra.Command{ - Use: "mtime", - Short: "print the object configuration file modification time", - Aliases: []string{"mtim", "mti", "mt", "m"}, + Use: "list", + Aliases: []string{"ls"}, + Short: "list app resources", + Long: "List app resources. Equivalent to 'resource ls --rid app'.", RunE: func(cmd *cobra.Command, args []string) error { return options.Run(kind) }, } flags := cmd.Flags() addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) return cmd } -func newCmdObjectScheduleList(kind string) *cobra.Command { - var options commands.CmdObjectScheduleList +func newCmdObjectDriverList(kind string) *cobra.Command { + var options commands.CmdObjectResourceList + options.RID = "driver" cmd := &cobra.Command{ Use: "list", - Short: "list the object scheduler entries", Aliases: []string{"ls"}, + Short: "list driver resources", + Long: "List driver resources. Equivalent to 'resource ls --rid driver'.", RunE: func(cmd *cobra.Command, args []string) error { return options.Run(kind) }, @@ -2325,17 +2197,17 @@ func newCmdObjectScheduleList(kind string) *cobra.Command { flags := cmd.Flags() addFlagsGlobal(flags, &options.OptsGlobal) commoncmd.FlagNodeSelector(flags, &options.NodeSelector) - flagLocal(flags, &options.Local) return cmd } -func newCmdObjectInstanceBoot(kind string) *cobra.Command { - var options commands.CmdObjectInstanceBoot +func newCmdObjectGroupsList(kind string) *cobra.Command { + var options commands.CmdObjectResourceList + options.RID = "groups" cmd := &cobra.Command{ - Use: "boot", - Hidden: true, - Short: "clean up actions executed on boot only", - Long: "SCSI reservation release, vg tags removal, ... Never execute this action manually.", + Use: "list", + Aliases: []string{"ls"}, + Short: "list groups resources", + Long: "List groups resources. Equivalent to 'resource ls --rid groups'.", RunE: func(cmd *cobra.Command, args []string) error { return options.Run(kind) }, @@ -2346,18 +2218,19 @@ func newCmdObjectInstanceBoot(kind string) *cobra.Command { return cmd } -func newCmdObjectInstanceDelete(kind string) *cobra.Command { - var options commands.CmdObjectInstanceDelete +func newCmdObjectContainerStart(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStart cmd := &cobra.Command{ - Use: "delete", - Aliases: []string{"del"}, - Short: "delete the instance configuration", - Long: "Delete the instance configuration\n\n" + - "Beware: this command only removes the selected instances configuration and states." + - " The config may be recreated by the daemon from a remote instance copy." + - " The delete command is not responsible for stopping or unprovisioning." + - " The deletion happens whatever the object status.", + Use: "start [ID]", + Short: "start a container resource", + Long: "Start a container resource. Specify a container ID as a positional argument. Equivalent to 'instance start --rid container#'.", + Args: cobra.MaximumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "container#" + args[0] + } else if options.RID == "" { + options.RID = "container" + } return options.Run(kind) }, } @@ -2365,72 +2238,123 @@ func newCmdObjectInstanceDelete(kind string) *cobra.Command { addFlagsGlobal(flags, &options.OptsGlobal) commoncmd.FlagsAsync(flags, &options.OptsAsync) commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") return cmd } -func newCmdObjectInstanceDeviceList(kind string) *cobra.Command { - var options commands.CmdObjectInstanceDeviceList +func newCmdObjectContainerStop(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStop cmd := &cobra.Command{ - GroupID: commoncmd.GroupIDQuery, - Use: "list", - Short: "print the object's exposed, used, base and claimed block devices", - Aliases: []string{"ls"}, + Use: "stop [ID]", + Short: "stop a container resource", + Long: "Stop a container resource. Specify a container ID as a positional argument. Equivalent to 'instance stop --rid container#'.", + Args: cobra.MaximumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "container#" + args[0] + } else if options.RID == "" { + options.RID = "container" + } return options.Run(kind) }, } flags := cmd.Flags() addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagMoveTo(flags, &options.MoveTo) commoncmd.FlagNodeSelector(flags, &options.NodeSelector) - commoncmd.FlagDevRoles(flags, &options.Roles) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") return cmd } -func newCmdObjectInstanceList(kind string) *cobra.Command { - var options commands.CmdObjectInstanceList +func newCmdObjectContainerRestart(kind string) *cobra.Command { + var options commands.CmdObjectInstanceRestart cmd := &cobra.Command{ - GroupID: commoncmd.GroupIDQuery, - Use: "list", - Aliases: []string{"ls"}, - Short: "object instances list", + Use: "restart [ID]", + Short: "restart a container resource", + Long: "Restart a container resource. Specify a container ID as a positional argument. Equivalent to 'instance restart --rid container#'.", + Args: cobra.MaximumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "container#" + args[0] + } else if options.RID == "" { + options.RID = "container" + } return options.Run(kind) }, } flags := cmd.Flags() addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") return cmd } -func newCmdObjectInstanceFreeze(kind string) *cobra.Command { - var options commands.CmdObjectInstanceFreeze +func newCmdObjectContainerProvision(kind string) *cobra.Command { + var options commands.CmdObjectInstanceProvision cmd := &cobra.Command{ - Use: "freeze", - Short: "block ha automatic start and monitor action", + Use: "provision [ID]", + Short: "provision a container resource", + Long: "Provision a container resource. Specify a container ID as a positional argument. Equivalent to 'instance provision --rid container#'.", + Args: cobra.MaximumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "container#" + args[0] + } else if options.RID == "" { + options.RID = "container" + } return options.Run(kind) }, } flags := cmd.Flags() addFlagsGlobal(flags, &options.OptsGlobal) commoncmd.FlagsAsync(flags, &options.OptsAsync) - commoncmd.FlagSlave(flags, &options.Slaves) - commoncmd.FlagSlaves(flags, &options.AllSlaves) - commoncmd.FlagMaster(flags, &options.Master) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagLeader(flags, &options.Leader) commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + commoncmd.HiddenFlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagStateOnly(flags, &options.StateOnly) return cmd } -func newCmdObjectInstanceProvision(kind string) *cobra.Command { - var options commands.CmdObjectInstanceProvision +func newCmdObjectContainerUnprovision(kind string) *cobra.Command { + var options commands.CmdObjectInstanceUnprovision cmd := &cobra.Command{ - Use: "provision", - Short: "allocate and start instance resources", - Long: "Allocate the system resources required by the object instance resources.\n\nFor example, provision a fs.ext3 resource means format the device with the mkfs.ext3 command.\n\nOperate on a selection of instances asynchronously using --node=.", - Aliases: []string{"prov"}, + Use: "unprovision [ID]", + Short: "unprovision a container resource", + Long: "Unprovision a container resource. Specify a container ID as a positional argument. Equivalent to 'instance unprovision --rid container#'.", + Args: cobra.MaximumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "container#" + args[0] + } else if options.RID == "" { + options.RID = "container" + } return options.Run(kind) }, } @@ -2444,17 +2368,23 @@ func newCmdObjectInstanceProvision(kind string) *cobra.Command { commoncmd.FlagForce(flags, &options.Force) commoncmd.FlagLeader(flags, &options.Leader) commoncmd.FlagNodeSelector(flags, &options.NodeSelector) - commoncmd.HiddenFlagDisableRollback(flags, &options.DisableRollback) commoncmd.FlagStateOnly(flags, &options.StateOnly) return cmd } -func newCmdObjectInstancePRStart(kind string) *cobra.Command { - var options commands.CmdObjectInstancePRStart +func newCmdObjectContainerStartStandby(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStartStandby cmd := &cobra.Command{ - Use: "prstart", - Short: "preempt devices exclusive write access reservation", + Use: "startstandby [ID]", + Short: "start a container resource in standby mode", + Long: "Start a container resource in standby mode. Specify a container ID as a positional argument. Equivalent to 'instance startstandby --rid container#'.", + Args: cobra.MaximumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "container#" + args[0] + } else if options.RID == "" { + options.RID = "container" + } return options.Run(kind) }, } @@ -2467,10 +2397,1962 @@ func newCmdObjectInstancePRStart(kind string) *cobra.Command { commoncmd.FlagsTo(flags, &options.OptTo) commoncmd.FlagForce(flags, &options.Force) commoncmd.FlagDisableRollback(flags, &options.DisableRollback) - commoncmd.FlagNodeSelector(flags, &options.NodeSelector) - hiddenFlagLocal(flags, &options.Local) - cmd.MarkFlagsMutuallyExclusive("no-lock", "node") - cmd.MarkFlagsMutuallyExclusive("waitlock", "node") + return cmd +} + +func newCmdObjectContainerShutdown(kind string) *cobra.Command { + var options commands.CmdObjectInstanceShutdown + cmd := &cobra.Command{ + Use: "shutdown [ID]", + Short: "shutdown a container resource", + Long: "Shutdown a container resource. Specify a container ID as a positional argument. Equivalent to 'instance shutdown --rid container#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "container#" + args[0] + } else if options.RID == "" { + options.RID = "container" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + return cmd +} + +func newCmdObjectContainerPRStart(kind string) *cobra.Command { + var options commands.CmdObjectInstancePRStart + cmd := &cobra.Command{ + Use: "prstart [ID]", + Short: "preempt devices exclusive write access reservation for a container resource", + Long: "Preempt devices exclusive write access reservation for a container resource. Specify a container ID as a positional argument. Equivalent to 'instance prstart --rid container#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "container#" + args[0] + } else if options.RID == "" { + options.RID = "container" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + hiddenFlagLocal(flags, &options.Local) + return cmd +} + +func newCmdObjectContainerPRStop(kind string) *cobra.Command { + var options commands.CmdObjectInstancePRStop + cmd := &cobra.Command{ + Use: "prstop [ID]", + Short: "release devices exclusive write access reservation for a container resource", + Long: "Release devices exclusive write access reservation for a container resource. Specify a container ID as a positional argument. Equivalent to 'instance prstop --rid container#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "container#" + args[0] + } else if options.RID == "" { + options.RID = "container" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + hiddenFlagLocal(flags, &options.Local) + return cmd +} + +func newCmdObjectIPStart(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStart + cmd := &cobra.Command{ + Use: "start [ID]", + Short: "start an ip resource", + Long: "Start an ip resource. Specify an ip ID as a positional argument. Equivalent to 'instance start --rid ip#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "ip#" + args[0] + } else if options.RID == "" { + options.RID = "ip" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") + return cmd +} + +func newCmdObjectIPStop(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStop + cmd := &cobra.Command{ + Use: "stop [ID]", + Short: "stop an ip resource", + Long: "Stop an ip resource. Specify an ip ID as a positional argument. Equivalent to 'instance stop --rid ip#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "ip#" + args[0] + } else if options.RID == "" { + options.RID = "ip" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagMoveTo(flags, &options.MoveTo) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") + return cmd +} + +func newCmdObjectIPRestart(kind string) *cobra.Command { + var options commands.CmdObjectInstanceRestart + cmd := &cobra.Command{ + Use: "restart [ID]", + Short: "restart an ip resource", + Long: "Restart an ip resource. Specify an ip ID as a positional argument. Equivalent to 'instance restart --rid ip#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "ip#" + args[0] + } else if options.RID == "" { + options.RID = "ip" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") + return cmd +} + +func newCmdObjectIPProvision(kind string) *cobra.Command { + var options commands.CmdObjectInstanceProvision + cmd := &cobra.Command{ + Use: "provision [ID]", + Short: "provision an ip resource", + Long: "Provision an ip resource. Specify an ip ID as a positional argument. Equivalent to 'instance provision --rid ip#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "ip#" + args[0] + } else if options.RID == "" { + options.RID = "ip" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagLeader(flags, &options.Leader) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + commoncmd.HiddenFlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagStateOnly(flags, &options.StateOnly) + return cmd +} + +func newCmdObjectIPUnprovision(kind string) *cobra.Command { + var options commands.CmdObjectInstanceUnprovision + cmd := &cobra.Command{ + Use: "unprovision [ID]", + Short: "unprovision an ip resource", + Long: "Unprovision an ip resource. Specify an ip ID as a positional argument. Equivalent to 'instance unprovision --rid ip#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "ip#" + args[0] + } else if options.RID == "" { + options.RID = "ip" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagLeader(flags, &options.Leader) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + commoncmd.FlagStateOnly(flags, &options.StateOnly) + return cmd +} + +func newCmdObjectIPStartStandby(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStartStandby + cmd := &cobra.Command{ + Use: "startstandby [ID]", + Short: "start an ip resource in standby mode", + Long: "Start an ip resource in standby mode. Specify an ip ID as a positional argument. Equivalent to 'instance startstandby --rid ip#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "ip#" + args[0] + } else if options.RID == "" { + options.RID = "ip" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + return cmd +} + +func newCmdObjectIPShutdown(kind string) *cobra.Command { + var options commands.CmdObjectInstanceShutdown + cmd := &cobra.Command{ + Use: "shutdown [ID]", + Short: "shutdown an ip resource", + Long: "Shutdown an ip resource. Specify an ip ID as a positional argument. Equivalent to 'instance shutdown --rid ip#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "ip#" + args[0] + } else if options.RID == "" { + options.RID = "ip" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + return cmd +} + +func newCmdObjectFSStart(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStart + cmd := &cobra.Command{ + Use: "start [ID]", + Short: "start a fs resource", + Long: "Start a fs resource. Specify a fs ID as a positional argument. Equivalent to 'instance start --rid fs#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "fs#" + args[0] + } else if options.RID == "" { + options.RID = "fs" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") + return cmd +} + +func newCmdObjectFSStartStandby(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStartStandby + cmd := &cobra.Command{ + Use: "startstandby [ID]", + Short: "start a fs resource in standby mode", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "fs#" + args[0] + } else if options.RID == "" { + options.RID = "fs" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + return cmd +} + +func newCmdObjectFSShutdown(kind string) *cobra.Command { + var options commands.CmdObjectInstanceShutdown + cmd := &cobra.Command{ + Use: "shutdown [ID]", + Short: "shutdown a fs resource", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "fs#" + args[0] + } else if options.RID == "" { + options.RID = "fs" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + return cmd +} + +func newCmdObjectFSPRStart(kind string) *cobra.Command { + var options commands.CmdObjectInstancePRStart + cmd := &cobra.Command{ + Use: "prstart [ID]", + Short: "preempt devices exclusive write access reservation for a fs resource", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "fs#" + args[0] + } else if options.RID == "" { + options.RID = "fs" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + hiddenFlagLocal(flags, &options.Local) + return cmd +} + +func newCmdObjectFSPRStop(kind string) *cobra.Command { + var options commands.CmdObjectInstancePRStop + cmd := &cobra.Command{ + Use: "prstop [ID]", + Short: "release devices exclusive write access reservation for a fs resource", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "fs#" + args[0] + } else if options.RID == "" { + options.RID = "fs" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + hiddenFlagLocal(flags, &options.Local) + return cmd +} + +func newCmdObjectFSStop(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStop + cmd := &cobra.Command{ + Use: "stop [ID]", + Short: "stop a fs resource", + Long: "Stop a fs resource. Specify a fs ID as a positional argument. Equivalent to 'instance stop --rid fs#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "fs#" + args[0] + } else if options.RID == "" { + options.RID = "fs" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagMoveTo(flags, &options.MoveTo) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") + return cmd +} + +func newCmdObjectFSRestart(kind string) *cobra.Command { + var options commands.CmdObjectInstanceRestart + cmd := &cobra.Command{ + Use: "restart [ID]", + Short: "restart a fs resource", + Long: "Restart a fs resource. Specify a fs ID as a positional argument. Equivalent to 'instance restart --rid fs#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "fs#" + args[0] + } else if options.RID == "" { + options.RID = "fs" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") + return cmd +} + +func newCmdObjectFSProvision(kind string) *cobra.Command { + var options commands.CmdObjectInstanceProvision + cmd := &cobra.Command{ + Use: "provision [ID]", + Short: "provision a fs resource", + Long: "Provision a fs resource. Specify a fs ID as a positional argument. Equivalent to 'instance provision --rid fs#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "fs#" + args[0] + } else if options.RID == "" { + options.RID = "fs" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagLeader(flags, &options.Leader) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + commoncmd.HiddenFlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagStateOnly(flags, &options.StateOnly) + return cmd +} + +func newCmdObjectFSUnprovision(kind string) *cobra.Command { + var options commands.CmdObjectInstanceUnprovision + cmd := &cobra.Command{ + Use: "unprovision [ID]", + Short: "unprovision a fs resource", + Long: "Unprovision a fs resource. Specify a fs ID as a positional argument. Equivalent to 'instance unprovision --rid fs#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "fs#" + args[0] + } else if options.RID == "" { + options.RID = "fs" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagLeader(flags, &options.Leader) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + commoncmd.FlagStateOnly(flags, &options.StateOnly) + return cmd +} + +func newCmdObjectVolumeStart(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStart + cmd := &cobra.Command{ + Use: "start [ID]", + Short: "start a volume resource", + Long: "Start a volume resource. Specify a volume ID as a positional argument. Equivalent to 'instance start --rid volume#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "volume#" + args[0] + } else if options.RID == "" { + options.RID = "volume" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") + return cmd +} + +func newCmdObjectVolumeStop(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStop + cmd := &cobra.Command{ + Use: "stop [ID]", + Short: "stop a volume resource", + Long: "Stop a volume resource. Specify a volume ID as a positional argument. Equivalent to 'instance stop --rid volume#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "volume#" + args[0] + } else if options.RID == "" { + options.RID = "volume" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagMoveTo(flags, &options.MoveTo) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") + return cmd +} + +func newCmdObjectVolumeRestart(kind string) *cobra.Command { + var options commands.CmdObjectInstanceRestart + cmd := &cobra.Command{ + Use: "restart [ID]", + Short: "restart a volume resource", + Long: "Restart a volume resource. Specify a volume ID as a positional argument. Equivalent to 'instance restart --rid volume#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "volume#" + args[0] + } else if options.RID == "" { + options.RID = "volume" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") + return cmd +} + +func newCmdObjectVolumeProvision(kind string) *cobra.Command { + var options commands.CmdObjectInstanceProvision + cmd := &cobra.Command{ + Use: "provision [ID]", + Short: "provision a volume resource", + Long: "Provision a volume resource. Specify a volume ID as a positional argument. Equivalent to 'instance provision --rid volume#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "volume#" + args[0] + } else if options.RID == "" { + options.RID = "volume" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagLeader(flags, &options.Leader) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + commoncmd.HiddenFlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagStateOnly(flags, &options.StateOnly) + return cmd +} + +func newCmdObjectVolumeUnprovision(kind string) *cobra.Command { + var options commands.CmdObjectInstanceUnprovision + cmd := &cobra.Command{ + Use: "unprovision [ID]", + Short: "unprovision a volume resource", + Long: "Unprovision a volume resource. Specify a volume ID as a positional argument. Equivalent to 'instance unprovision --rid volume#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "volume#" + args[0] + } else if options.RID == "" { + options.RID = "volume" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagLeader(flags, &options.Leader) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + commoncmd.FlagStateOnly(flags, &options.StateOnly) + return cmd +} + +func newCmdObjectVolumeStartStandby(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStartStandby + cmd := &cobra.Command{ + Use: "startstandby [ID]", + Short: "start a volume resource in standby mode", + Long: "Start a volume resource in standby mode. Specify a volume ID as a positional argument. Equivalent to 'instance startstandby --rid volume#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "volume#" + args[0] + } else if options.RID == "" { + options.RID = "volume" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + hiddenFlagLocal(flags, &options.Local) + return cmd +} + +func newCmdObjectVolumeShutdown(kind string) *cobra.Command { + var options commands.CmdObjectInstanceShutdown + cmd := &cobra.Command{ + Use: "shutdown [ID]", + Short: "shutdown a volume resource", + Long: "Shutdown a volume resource. Specify a volume ID as a positional argument. Equivalent to 'instance shutdown --rid volume#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "volume#" + args[0] + } else if options.RID == "" { + options.RID = "volume" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + hiddenFlagLocal(flags, &options.Local) + return cmd +} + +func newCmdObjectVolumePRStart(kind string) *cobra.Command { + var options commands.CmdObjectInstancePRStart + cmd := &cobra.Command{ + Use: "prstart [ID]", + Short: "preempt devices exclusive write access reservation for a volume resource", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "volume#" + args[0] + } else if options.RID == "" { + options.RID = "volume" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + hiddenFlagLocal(flags, &options.Local) + return cmd +} + +func newCmdObjectVolumePRStop(kind string) *cobra.Command { + var options commands.CmdObjectInstancePRStop + cmd := &cobra.Command{ + Use: "prstop [ID]", + Short: "release devices exclusive write access reservation for a volume resource", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "volume#" + args[0] + } else if options.RID == "" { + options.RID = "volume" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + hiddenFlagLocal(flags, &options.Local) + return cmd +} + +func newCmdObjectDiskStart(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStart + cmd := &cobra.Command{ + Use: "start [ID]", + Short: "start a disk resource", + Long: "Start a disk resource. Specify a disk ID as a positional argument. Equivalent to 'instance start --rid disk#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "disk#" + args[0] + } else if options.RID == "" { + options.RID = "disk" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") + return cmd +} + +func newCmdObjectDiskStop(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStop + cmd := &cobra.Command{ + Use: "stop [ID]", + Short: "stop a disk resource", + Long: "Stop a disk resource. Specify a disk ID as a positional argument. Equivalent to 'instance stop --rid disk#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "disk#" + args[0] + } else if options.RID == "" { + options.RID = "disk" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagMoveTo(flags, &options.MoveTo) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") + return cmd +} + +func newCmdObjectDiskRestart(kind string) *cobra.Command { + var options commands.CmdObjectInstanceRestart + cmd := &cobra.Command{ + Use: "restart [ID]", + Short: "restart a disk resource", + Long: "Restart a disk resource. Specify a disk ID as a positional argument. Equivalent to 'instance restart --rid disk#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "disk#" + args[0] + } else if options.RID == "" { + options.RID = "disk" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") + return cmd +} + +func newCmdObjectDiskProvision(kind string) *cobra.Command { + var options commands.CmdObjectInstanceProvision + cmd := &cobra.Command{ + Use: "provision [ID]", + Short: "provision a disk resource", + Long: "Provision a disk resource. Specify a disk ID as a positional argument. Equivalent to 'instance provision --rid disk#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "disk#" + args[0] + } else if options.RID == "" { + options.RID = "disk" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagLeader(flags, &options.Leader) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + commoncmd.HiddenFlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagStateOnly(flags, &options.StateOnly) + return cmd +} + +func newCmdObjectDiskUnprovision(kind string) *cobra.Command { + var options commands.CmdObjectInstanceUnprovision + cmd := &cobra.Command{ + Use: "unprovision [ID]", + Short: "unprovision a disk resource", + Long: "Unprovision a disk resource. Specify a disk ID as a positional argument. Equivalent to 'instance unprovision --rid disk#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "disk#" + args[0] + } else if options.RID == "" { + options.RID = "disk" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagLeader(flags, &options.Leader) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + commoncmd.FlagStateOnly(flags, &options.StateOnly) + return cmd +} + +func newCmdObjectDiskStartStandby(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStartStandby + cmd := &cobra.Command{ + Use: "startstandby [ID]", + Short: "start a disk resource in standby mode", + Long: "Start a disk resource in standby mode. Specify a disk ID as a positional argument. Equivalent to 'instance startstandby --rid disk#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "disk#" + args[0] + } else if options.RID == "" { + options.RID = "disk" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + hiddenFlagLocal(flags, &options.Local) + return cmd +} + +func newCmdObjectDiskShutdown(kind string) *cobra.Command { + var options commands.CmdObjectInstanceShutdown + cmd := &cobra.Command{ + Use: "shutdown [ID]", + Short: "shutdown a disk resource", + Long: "Shutdown a disk resource. Specify a disk ID as a positional argument. Equivalent to 'instance shutdown --rid disk#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "disk#" + args[0] + } else if options.RID == "" { + options.RID = "disk" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + hiddenFlagLocal(flags, &options.Local) + return cmd +} + +func newCmdObjectDiskPRStart(kind string) *cobra.Command { + var options commands.CmdObjectInstancePRStart + cmd := &cobra.Command{ + Use: "prstart [ID]", + Short: "preempt devices exclusive write access reservation for a disk resource", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "disk#" + args[0] + } else if options.RID == "" { + options.RID = "disk" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + hiddenFlagLocal(flags, &options.Local) + return cmd +} + +func newCmdObjectDiskPRStop(kind string) *cobra.Command { + var options commands.CmdObjectInstancePRStop + cmd := &cobra.Command{ + Use: "prstop [ID]", + Short: "release devices exclusive write access reservation for a disk resource", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "disk#" + args[0] + } else if options.RID == "" { + options.RID = "disk" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + hiddenFlagLocal(flags, &options.Local) + return cmd +} + +func newCmdObjectShareStart(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStart + cmd := &cobra.Command{ + Use: "start [ID]", + Short: "start a share resource", + Long: "Start a share resource. Specify a share ID as a positional argument. Equivalent to 'instance start --rid share#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "share#" + args[0] + } else if options.RID == "" { + options.RID = "share" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") + return cmd +} + +func newCmdObjectShareStop(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStop + cmd := &cobra.Command{ + Use: "stop [ID]", + Short: "stop a share resource", + Long: "Stop a share resource. Specify a share ID as a positional argument. Equivalent to 'instance stop --rid share#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "share#" + args[0] + } else if options.RID == "" { + options.RID = "share" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagMoveTo(flags, &options.MoveTo) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") + return cmd +} + +func newCmdObjectShareRestart(kind string) *cobra.Command { + var options commands.CmdObjectInstanceRestart + cmd := &cobra.Command{ + Use: "restart [ID]", + Short: "restart a share resource", + Long: "Restart a share resource. Specify a share ID as a positional argument. Equivalent to 'instance restart --rid share#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "share#" + args[0] + } else if options.RID == "" { + options.RID = "share" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") + return cmd +} + +func newCmdObjectShareProvision(kind string) *cobra.Command { + var options commands.CmdObjectInstanceProvision + cmd := &cobra.Command{ + Use: "provision [ID]", + Short: "provision a share resource", + Long: "Provision a share resource. Specify a share ID as a positional argument. Equivalent to 'instance provision --rid share#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "share#" + args[0] + } else if options.RID == "" { + options.RID = "share" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagLeader(flags, &options.Leader) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + commoncmd.HiddenFlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagStateOnly(flags, &options.StateOnly) + return cmd +} + +func newCmdObjectShareUnprovision(kind string) *cobra.Command { + var options commands.CmdObjectInstanceUnprovision + cmd := &cobra.Command{ + Use: "unprovision [ID]", + Short: "unprovision a share resource", + Long: "Unprovision a share resource. Specify a share ID as a positional argument. Equivalent to 'instance unprovision --rid share#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "share#" + args[0] + } else if options.RID == "" { + options.RID = "share" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagLeader(flags, &options.Leader) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + commoncmd.FlagStateOnly(flags, &options.StateOnly) + return cmd +} + +func newCmdObjectShareStartStandby(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStartStandby + cmd := &cobra.Command{ + Use: "startstandby [ID]", + Short: "start a share resource in standby mode", + Long: "Start a share resource in standby mode. Specify a share ID as a positional argument. Equivalent to 'instance startstandby --rid share#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "share#" + args[0] + } else if options.RID == "" { + options.RID = "share" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + hiddenFlagLocal(flags, &options.Local) + return cmd +} + +func newCmdObjectShareShutdown(kind string) *cobra.Command { + var options commands.CmdObjectInstanceShutdown + cmd := &cobra.Command{ + Use: "shutdown [ID]", + Short: "shutdown a share resource", + Long: "Shutdown a share resource. Specify a share ID as a positional argument. Equivalent to 'instance shutdown --rid share#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "share#" + args[0] + } else if options.RID == "" { + options.RID = "share" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + hiddenFlagLocal(flags, &options.Local) + return cmd +} + +func newCmdObjectAppStart(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStart + cmd := &cobra.Command{ + Use: "start [ID]", + Short: "start an app resource", + Long: "Start an app resource. Specify an app ID as a positional argument. Equivalent to 'instance start --rid app#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "app#" + args[0] + } else if options.RID == "" { + options.RID = "app" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") + return cmd +} + +func newCmdObjectAppStop(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStop + cmd := &cobra.Command{ + Use: "stop [ID]", + Short: "stop an app resource", + Long: "Stop an app resource. Specify an app ID as a positional argument. Equivalent to 'instance stop --rid app#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "app#" + args[0] + } else if options.RID == "" { + options.RID = "app" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagMoveTo(flags, &options.MoveTo) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") + return cmd +} + +func newCmdObjectAppRestart(kind string) *cobra.Command { + var options commands.CmdObjectInstanceRestart + cmd := &cobra.Command{ + Use: "restart [ID]", + Short: "restart an app resource", + Long: "Restart an app resource. Specify an app ID as a positional argument. Equivalent to 'instance restart --rid app#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "app#" + args[0] + } else if options.RID == "" { + options.RID = "app" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") + return cmd +} + +func newCmdObjectAppShutdown(kind string) *cobra.Command { + var options commands.CmdObjectInstanceShutdown + cmd := &cobra.Command{ + Use: "shutdown [ID]", + Short: "shutdown an app resource", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "app#" + args[0] + } else if options.RID == "" { + options.RID = "app" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + hiddenFlagLocal(flags, &options.Local) + return cmd +} + +func newCmdObjectAppStartStandby(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStartStandby + cmd := &cobra.Command{ + Use: "startstandby [ID]", + Short: "start a app resource in standby mode", + Long: "Start a app resource in standby mode. Specify a share ID as a positional argument. Equivalent to 'instance startstandby --rid app#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "app#" + args[0] + } else if options.RID == "" { + options.RID = "app" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + hiddenFlagLocal(flags, &options.Local) + return cmd +} + +func newCmdObjectTaskRun(kind string) *cobra.Command { + var options commands.CmdObjectInstanceRun + cmd := &cobra.Command{ + Use: "run [ID]", + Short: "execute a task resource", + Long: "Execute a task resource. Specify a task ID as a positional argument or let om select the task if unambiguous.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "task#" + args[0] + } else if options.RID == "" { + options.RID = "task" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagConfirm(flags, &options.Confirm) + commoncmd.FlagCron(flags, &options.Cron) + commoncmd.FlagEnv(flags, &options.Env) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + hiddenFlagLocal(flags, &options.Local) + return cmd +} + +func newCmdObjectSyncUpdate(kind string) *cobra.Command { + var options commands.CmdObjectInstanceSyncUpdate + cmd := &cobra.Command{ + Use: "update [ID]", + Short: "synchronize the copy of the local dataset on peers", + Long: "Execute a sync update action. Specify a sync ID as a positional argument or let om select the sync if unambiguous.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "sync#" + args[0] + } else if options.RID == "" { + options.RID = "sync" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagTarget(flags, &options.Target) + hiddenFlagLocal(flags, &options.Local) + return cmd +} + +func newCmdObjectSyncFull(kind string) *cobra.Command { + var options commands.CmdObjectInstanceSyncFull + cmd := &cobra.Command{ + Use: "full [ID]", + Short: "full copy of the local dataset on peers", + Long: "Execute a sync full action. Specify a sync ID as a positional argument or let om select the sync if unambiguous.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "sync#" + args[0] + } else if options.RID == "" { + options.RID = "sync" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagTarget(flags, &options.Target) + hiddenFlagLocal(flags, &options.Local) + return cmd +} + +func newCmdObjectSyncIngest(kind string) *cobra.Command { + var options commands.CmdObjectInstanceSyncIngest + cmd := &cobra.Command{ + Use: "ingest [ID]", + Short: "ingest files received from the active instance", + Long: "Execute a sync ingest action. Specify a sync ID as a positional argument or let om select the sync if unambiguous.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "sync#" + args[0] + } else if options.RID == "" { + options.RID = "sync" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + hiddenFlagLocal(flags, &options.Local) + return cmd +} + +func newCmdObjectSyncResync(kind string) *cobra.Command { + var options commands.CmdObjectInstanceSyncResync + cmd := &cobra.Command{ + Use: "resync [ID]", + Short: "restore optimal synchronization", + Long: "Execute a sync resync action. Specify a sync ID as a positional argument or let om select the sync if unambiguous.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "sync#" + args[0] + } else if options.RID == "" { + options.RID = "sync" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + hiddenFlagLocal(flags, &options.Local) + return cmd +} + +func newCmdObjectSyncSplit(kind string) *cobra.Command { + var options commands.CmdObjectInstanceSyncSplit + cmd := &cobra.Command{ + Use: "split [ID]", + Short: "make both ends of a replicated pair read-write", + Long: "Execute a sync split action. Specify a sync ID as a positional argument or let om select the sync if unambiguous.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "sync#" + args[0] + } else if options.RID == "" { + options.RID = "sync" + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + hiddenFlagLocal(flags, &options.Local) + return cmd +} + +func newCmdObjectSyncList(kind string) *cobra.Command { + var options commands.CmdObjectResourceList + options.RID = "sync" + cmd := &cobra.Command{ + Use: "list", + Aliases: []string{"ls"}, + Short: "list sync resources", + Long: "List sync resources. Equivalent to 'resource ls --rid sync'.", + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + return cmd +} + +func newCmdObjectTaskList(kind string) *cobra.Command { + var options commands.CmdObjectResourceList + options.RID = "task" + cmd := &cobra.Command{ + Use: "list", + Aliases: []string{"ls"}, + Short: "list task resources", + Long: "List task resources. Equivalent to 'resource ls --rid task'.", + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + return cmd +} + +func newCmdObjectConfigEval(kind string) *cobra.Command { + var options commands.CmdObjectConfigGet + cmd := &cobra.Command{ + Use: "eval", + Short: "evaluate a configuration key value", + RunE: func(cmd *cobra.Command, args []string) error { + options.Eval = true + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagKeywords(flags, &options.Keywords) + commoncmd.FlagImpersonate(flags, &options.Impersonate) + flagLocal(flags, &options.Local) + return cmd +} + +func newCmdObjectFreeze(kind string) *cobra.Command { + var options commands.CmdObjectFreeze + cmd := &cobra.Command{ + GroupID: commoncmd.GroupIDOrchestratedActions, + Use: "freeze", + Short: "block ha automatic start and monitor action", + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.HiddenFlagNodeSelector(flags, &options.NodeSelector) + hiddenFlagLocal(flags, &options.Local) + return cmd +} + +func newCmdObjectConfigGet(kind string) *cobra.Command { + var options commands.CmdObjectConfigGet + cmd := &cobra.Command{ + Use: "get", + Short: "get a configuration key value", + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagEval(flags, &options.Eval) + commoncmd.FlagImpersonate(flags, &options.Impersonate) + commoncmd.FlagKeywords(flags, &options.Keywords) + flagLocal(flags, &options.Local) + return cmd +} + +func newCmdObjectGiveback(kind string) *cobra.Command { + var options commands.CmdObjectGiveback + cmd := &cobra.Command{ + GroupID: commoncmd.GroupIDOrchestratedActions, + Use: "giveback", + Short: "orchestrate to reach optimal placement", + Long: "Stop the misplaced service instances and start on the preferred nodes.", + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + return cmd +} + +func newCmdObjectLogs(kind string) *cobra.Command { + var options commands.CmdObjectLogs + cmd := &cobra.Command{ + GroupID: commoncmd.GroupIDQuery, + Use: "logs", + Aliases: []string{"log"}, + Short: "show object logs", + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsLogs(flags, &options.OptsLogs) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + flagLocal(flags, &options.Local) + return cmd +} + +func newCmdObjectList(kind string) *cobra.Command { + var options commands.CmdObjectList + cmd := &cobra.Command{ + GroupID: commoncmd.GroupIDQuery, + Use: "list", + Short: "print the selected objects path", + Aliases: []string{"ls"}, + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + return cmd +} + +func newCmdObjectConfigShow(kind string) *cobra.Command { + var options commands.CmdObjectConfigShow + cmd := &cobra.Command{ + Use: "show", + Short: "show the object configuration", + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + commoncmd.FlagObjectSelector(flags, &options.ObjectSelector) + commoncmd.FlagSections(flags, &options.Sections) + return cmd +} + +func newCmdObjectConfigMtime(kind string) *cobra.Command { + var options commands.CmdObjectConfigMtime + cmd := &cobra.Command{ + Use: "mtime", + Short: "print the object configuration file modification time", + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + return cmd +} + +func newCmdObjectScheduleList(kind string) *cobra.Command { + var options commands.CmdObjectScheduleList + cmd := &cobra.Command{ + Use: "list", + Short: "list the object scheduler entries", + Aliases: []string{"ls"}, + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + flagLocal(flags, &options.Local) + return cmd +} + +func newCmdObjectInstanceBoot(kind string) *cobra.Command { + var options commands.CmdObjectInstanceBoot + cmd := &cobra.Command{ + Use: "boot", + Hidden: true, + Short: "clean up actions executed on boot only", + Long: "SCSI reservation release, vg tags removal, ... Never execute this action manually.", + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + return cmd +} + +func newCmdObjectInstanceDelete(kind string) *cobra.Command { + var options commands.CmdObjectInstanceDelete + cmd := &cobra.Command{ + Use: "delete", + Aliases: []string{"del"}, + Short: "delete the instance configuration", + Long: "Delete the instance configuration\n\n" + + "Beware: this command only removes the selected instances configuration and states." + + " The config may be recreated by the daemon from a remote instance copy." + + " The delete command is not responsible for stopping or unprovisioning." + + " The deletion happens whatever the object status.", + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + return cmd +} + +func newCmdObjectInstanceDeviceList(kind string) *cobra.Command { + var options commands.CmdObjectInstanceDeviceList + cmd := &cobra.Command{ + GroupID: commoncmd.GroupIDQuery, + Use: "list", + Short: "print the object's exposed, used, base and claimed block devices", + Aliases: []string{"ls"}, + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + commoncmd.FlagDevRoles(flags, &options.Roles) + return cmd +} + +func newCmdObjectInstanceList(kind string) *cobra.Command { + var options commands.CmdObjectInstanceList + cmd := &cobra.Command{ + GroupID: commoncmd.GroupIDQuery, + Use: "list", + Aliases: []string{"ls"}, + Short: "object instances list", + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + return cmd +} + +func newCmdObjectInstanceFreeze(kind string) *cobra.Command { + var options commands.CmdObjectInstanceFreeze + cmd := &cobra.Command{ + Use: "freeze", + Short: "block ha automatic start and monitor action", + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagSlave(flags, &options.Slaves) + commoncmd.FlagSlaves(flags, &options.AllSlaves) + commoncmd.FlagMaster(flags, &options.Master) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + return cmd +} + +func newCmdObjectInstanceProvision(kind string) *cobra.Command { + var options commands.CmdObjectInstanceProvision + cmd := &cobra.Command{ + Use: "provision", + Short: "allocate and start instance resources", + Long: "Allocate the system resources required by the object instance resources.\n\nFor example, provision a fs.ext3 resource means format the device with the mkfs.ext3 command.\n\nOperate on a selection of instances asynchronously using --node=.", + Aliases: []string{"prov"}, + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagLeader(flags, &options.Leader) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + commoncmd.HiddenFlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagStateOnly(flags, &options.StateOnly) + return cmd +} + +func newCmdObjectInstancePRStart(kind string) *cobra.Command { + var options commands.CmdObjectInstancePRStart + cmd := &cobra.Command{ + Use: "prstart", + Short: "preempt devices exclusive write access reservation", + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + hiddenFlagLocal(flags, &options.Local) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") return cmd } @@ -2623,7 +4505,7 @@ func newCmdObjectInstanceStatus(kind string) *cobra.Command { cmd := &cobra.Command{ GroupID: commoncmd.GroupIDQuery, Use: "status", - Aliases: []string{"statu", "stat", "sta", "st"}, + Aliases: []string{"stat"}, Short: "print the object instances status", Long: `Resources Flags: @@ -2931,7 +4813,7 @@ func newCmdObjectInstanceSyncUpdate(kind string) *cobra.Command { return cmd } -func newCmdObjectInstanceResourceInfoList(kind string) *cobra.Command { +func newCmdObjectResourceInfoList(kind string) *cobra.Command { var options commands.CmdObjectInstanceResourceInfoList cmd := &cobra.Command{ Use: "list", @@ -2947,7 +4829,7 @@ func newCmdObjectInstanceResourceInfoList(kind string) *cobra.Command { return cmd } -func newCmdObjectInstanceResourceInfoPush(kind string) *cobra.Command { +func newCmdObjectResourceInfoPush(kind string) *cobra.Command { var options commands.CmdObjectInstanceResourceInfoPush cmd := &cobra.Command{ Use: "push", @@ -2981,6 +4863,323 @@ func newCmdObjectResourceList(kind string) *cobra.Command { return cmd } +func newCmdObjectResourceProvision(kind string) *cobra.Command { + var options commands.CmdObjectInstanceProvision + cmd := &cobra.Command{ + Use: "provision ", + Short: "allocate the system resources of the instance resources", + Long: "Allocate the system resources required by the object instance resources identified by the rid selector.\n\nFor example, provision a fs.ext3 resource means format the device with the mkfs.ext3 command.", + Aliases: []string{"prov"}, + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + options.OptsResourceSelector.RID = args[0] + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagLeader(flags, &options.Leader) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + commoncmd.HiddenFlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagStateOnly(flags, &options.StateOnly) + return cmd +} + +func newCmdObjectResourceUnprovision(kind string) *cobra.Command { + var options commands.CmdObjectInstanceUnprovision + cmd := &cobra.Command{ + Use: "unprovision ", + Short: "deallocate the system resources of the instance resources", + Long: "Deallocate the system resources used by the object instance resources identified by the rid selector.", + Aliases: []string{"unprov"}, + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + options.OptsResourceSelector.RID = args[0] + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + return cmd +} + +func newCmdObjectResourcePRStart(kind string) *cobra.Command { + var options commands.CmdObjectInstancePRStart + cmd := &cobra.Command{ + Use: "prstart ", + Short: "preempt devices exclusive write access reservation", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + options.OptsResourceSelector.RID = args[0] + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + return cmd +} + +func newCmdObjectResourcePRStop(kind string) *cobra.Command { + var options commands.CmdObjectInstancePRStop + cmd := &cobra.Command{ + Use: "prstop ", + Short: "release devices exclusive write access reservation", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + options.OptsResourceSelector.RID = args[0] + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + return cmd +} + +func newCmdObjectResourceRestart(kind string) *cobra.Command { + var options commands.CmdObjectInstanceRestart + cmd := &cobra.Command{ + Use: "restart ", + Short: "restart the instance resources", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + options.OptsResourceSelector.RID = args[0] + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + return cmd +} + +func newCmdObjectResourceRun(kind string) *cobra.Command { + var options commands.CmdObjectInstanceRun + cmd := &cobra.Command{ + Use: "run ", + Short: "execute the instance resource run action", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + options.OptsResourceSelector.RID = args[0] + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + return cmd +} + +func newCmdObjectResourceStart(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStart + cmd := &cobra.Command{ + Use: "start ", + Short: "start the instance resources", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + options.OptsResourceSelector.RID = args[0] + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + return cmd +} + +func newCmdObjectResourceStartStandby(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStartStandby + cmd := &cobra.Command{ + Use: "startstandby ", + Short: "start the instance resources in standby mode", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + options.OptsResourceSelector.RID = args[0] + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + return cmd +} + +func newCmdObjectResourceStop(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStop + cmd := &cobra.Command{ + Use: "stop ", + Short: "stop the instance resources", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + options.OptsResourceSelector.RID = args[0] + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + return cmd +} + +func newCmdObjectResourceSync(kind string) *cobra.Command { + cmd := commoncmd.NewCmdObjectResourceSync(kind) + cmd.AddCommand( + newCmdObjectResourceSyncFull(kind), + newCmdObjectResourceSyncIngest(kind), + newCmdObjectResourceSyncResync(kind), + newCmdObjectResourceSyncSplit(kind), + newCmdObjectResourceSyncUpdate(kind), + ) + return cmd +} + +func newCmdObjectResourceSyncFull(kind string) *cobra.Command { + var options commands.CmdObjectInstanceSyncFull + cmd := &cobra.Command{ + Use: "full ", + Short: "synchronize the copy of the local dataset on peers by sending the full data", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + options.OptsResourceSelector.RID = args[0] + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagTarget(flags, &options.Target) + hiddenFlagLocal(flags, &options.Local) + return cmd +} + +func newCmdObjectResourceSyncIngest(kind string) *cobra.Command { + var options commands.CmdObjectInstanceSyncIngest + cmd := &cobra.Command{ + Use: "ingest ", + Short: "synchronize the copy of the local dataset on peers by receiving the full data", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + options.OptsResourceSelector.RID = args[0] + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + hiddenFlagLocal(flags, &options.Local) + return cmd +} + +func newCmdObjectResourceSyncResync(kind string) *cobra.Command { + var options commands.CmdObjectInstanceSyncResync + cmd := &cobra.Command{ + Use: "resync ", + Short: "synchronize the copy of the local dataset on peers by receiving incremental data", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + options.OptsResourceSelector.RID = args[0] + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagForce(flags, &options.Force) + hiddenFlagLocal(flags, &options.Local) + return cmd +} + +func newCmdObjectResourceSyncSplit(kind string) *cobra.Command { + var options commands.CmdObjectInstanceSyncSplit + cmd := &cobra.Command{ + Use: "split ", + Short: "change the sync peer list", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + options.OptsResourceSelector.RID = args[0] + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsLock(flags, &options.OptsLock) + return cmd +} + +func newCmdObjectResourceSyncUpdate(kind string) *cobra.Command { + var options commands.CmdObjectInstanceSyncUpdate + cmd := &cobra.Command{ + Use: "update ", + Short: "synchronize the copy of the local dataset on peers", + Long: "Synchronize the copy of the local dataset on peers for the instance resource identified by the rid selector. This update can use either full or incremental copy, depending on the resource drivers and host capabilities.", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + options.OptsResourceSelector.RID = args[0] + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagTarget(flags, &options.Target) + hiddenFlagLocal(flags, &options.Local) + return cmd +} + func newCmdObjectSetProvisioned(kind string) *cobra.Command { var options commands.CmdObjectInstanceProvision cmd := &cobra.Command{ @@ -3039,8 +5238,8 @@ func newCmdObjectInstanceShutdown(kind string) *cobra.Command { flags := cmd.Flags() addFlagsGlobal(flags, &options.OptsGlobal) commoncmd.FlagsAsync(flags, &options.OptsAsync) - commoncmd.FlagsLock(flags, &options.OptsLock) commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsLock(flags, &options.OptsLock) commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) commoncmd.FlagsTo(flags, &options.OptTo) commoncmd.FlagForce(flags, &options.Force) @@ -3104,7 +5303,7 @@ func newCmdObjectStatus(kind string) *cobra.Command { cmd := &cobra.Command{ Use: "status", Hidden: true, - Aliases: []string{"statu", "stat", "sta", "st"}, + Aliases: []string{"stat", "st"}, Long: "Internal, for use by the daemon scheduler. This command is silent. Only the exitcode holds information. The exitcode is set to the instance avail status.", RunE: func(cmd *cobra.Command, args []string) error { return options.Run(kind) @@ -3274,7 +5473,7 @@ func newCmdObjectValidateConfig(kind string) *cobra.Command { Use: "config", Short: "verify the object configuration syntax", Hidden: true, - Aliases: []string{"conf", "co", "cf", "cfg"}, + Aliases: []string{"conf", "cf", "cfg"}, RunE: func(cmd *cobra.Command, args []string) error { return options.Run(kind) }, @@ -3337,7 +5536,7 @@ func newCmdNodePrintConfig() *cobra.Command { cmd := newCmdNodeConfigShow() cmd.Use = "config" cmd.Hidden = true - cmd.Aliases = []string{"conf", "co", "cf", "cfg"} + cmd.Aliases = []string{"conf", "cf", "cfg"} return cmd } @@ -3391,7 +5590,7 @@ func newCmdNodeUnset() *cobra.Command { func newCmdNodeValidate() *cobra.Command { cmd := newCmdNodeConfigValidate() cmd.Hidden = true - cmd.Aliases = []string{"validat", "valida", "valid", "val"} + cmd.Aliases = []string{"valid", "val"} return cmd } @@ -3447,7 +5646,7 @@ func newCmdObjectUnset(kind string) *cobra.Command { func newCmdObjectValidate(kind string) *cobra.Command { cmd := newCmdObjectConfigValidate(kind) cmd.Hidden = true - cmd.Aliases = []string{"validat", "valida", "valid", "vali", "val"} + cmd.Aliases = []string{"valid", "val"} return cmd } @@ -3469,7 +5668,7 @@ func newCmdObjectPrintConfig(kind string) *cobra.Command { cmd := newCmdObjectConfigShow(kind) cmd.Use = "config" cmd.Hidden = true - cmd.Aliases = []string{"conf", "co", "cf", "cfg"} + cmd.Aliases = []string{"conf", "cf", "cfg"} return cmd } @@ -3489,6 +5688,7 @@ func newCmdNodePrintCapabilities() *cobra.Command { cmd := newCmdNodeCapabilitiesList() cmd.Hidden = true cmd.Aliases = []string{"cap", "caps", "capa"} + cmd.Use = "capabilities" return cmd } @@ -3496,6 +5696,7 @@ func newCmdNodeScanCapabilities() *cobra.Command { cmd := newCmdNodeCapabilitiesScan() cmd.Hidden = true cmd.Aliases = []string{"cap", "caps", "capa"} + cmd.Use = "capabilities" return cmd } @@ -3676,7 +5877,18 @@ func newCmdObjectRun(kind string) *cobra.Command { } func newCmdObjectEnter(kind string) *cobra.Command { - cmd := newCmdObjectContainerEnter(kind) + var options commands.CmdObjectContainerEnter + cmd := &cobra.Command{ + Use: "enter", + Short: "open a shell in a container resource", + Long: "Enter any container resource. Use --rid to specify which container to enter.", + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagObject(flags, &options.ObjectSelector) + commoncmd.FlagRIDWithCompletion(cmd, &options.RID) cmd.Hidden = true return cmd } diff --git a/core/om/flags.go b/core/om/flags.go index 4905fcda1..a7bf4647d 100644 --- a/core/om/flags.go +++ b/core/om/flags.go @@ -11,10 +11,7 @@ import ( ) func addFlagsGlobal(flags *pflag.FlagSet, options *commands.OptsGlobal) { - commoncmd.FlagColor(flags, &options.Color) - commoncmd.FlagOutput(flags, &options.Output) - commoncmd.FlagObjectSelector(flags, &options.ObjectSelector) - commoncmd.FlagIgnoreNotFound(flags, &options.IgnoreNotFound) + commoncmd.AddFlagsGlobal(flags, &options.OptsGlobal) } func flagLocal(flags *pflag.FlagSet, p *bool) { diff --git a/core/om/kind_all.go b/core/om/kind_all.go index 78cf0d072..6014a16cf 100644 --- a/core/om/kind_all.go +++ b/core/om/kind_all.go @@ -8,7 +8,7 @@ import ( func init() { kind := "" - cmdObject := newCmdAll() + cmdObject := commoncmd.NewCmdAll() cmdObjectCollector := commoncmd.NewCmdObjectCollector(kind) cmdObjectCollectorTag := newCmdObjectCollectorTag(kind) cmdObjectCompliance := commoncmd.NewCmdObjectCompliance(kind) @@ -18,12 +18,17 @@ func init() { cmdObjectComplianceList := newCmdObjectComplianceList(kind) cmdObjectConfig := commoncmd.NewCmdObjectConfig(kind) cmdObjectContainer := commoncmd.NewCmdObjectContainer(kind) + cmdObjectIP := commoncmd.NewCmdObjectIP(kind) + cmdObjectFS := commoncmd.NewCmdObjectFS(kind) + cmdObjectVolume := commoncmd.NewCmdObjectVolume(kind) + cmdObjectDisk := commoncmd.NewCmdObjectDisk(kind) + cmdObjectShare := commoncmd.NewCmdObjectShare(kind) + cmdObjectApp := commoncmd.NewCmdObjectApp(kind) + cmdObjectTask := commoncmd.NewCmdObjectTask(kind) cmdObjectEdit := newCmdObjectEdit(kind) cmdObjectInstance := commoncmd.NewCmdObjectInstance(kind) cmdObjectInstancePG := commoncmd.NewCmdObjectInstancePG(kind) cmdObjectInstanceDevice := commoncmd.NewCmdObjectInstanceDevice(kind) - cmdObjectInstanceResource := commoncmd.NewCmdObjectInstanceResource(kind) - cmdObjectInstanceResourceInfo := commoncmd.NewCmdObjectInstanceResourceInfo(kind) cmdObjectInstanceSync := commoncmd.NewCmdObjectInstanceSync(kind) cmdObjectPG := commoncmd.NewCmdObjectInstancePG(kind) cmdObjectPG.Hidden = true @@ -31,6 +36,7 @@ func init() { cmdObjectPrintConfig := newCmdObjectPrintConfig(kind) cmdObjectPush := newCmdObjectPush(kind) cmdObjectResource := commoncmd.NewCmdObjectResource(kind) + cmdObjectResourceInfo := commoncmd.NewCmdObjectResourceInfo(kind) cmdObjectSet := newCmdObjectSet(kind) cmdObjectSchedule := commoncmd.NewCmdObjectSchedule(kind) cmdObjectSync := commoncmd.NewCmdObjectSync(kind) @@ -39,6 +45,7 @@ func init() { cmdObject.AddGroup( commoncmd.NewGroupOrchestratedActions(), commoncmd.NewGroupQuery(), + commoncmd.NewGroupResources(), commoncmd.NewGroupSubsystems(), ) root.AddCommand( @@ -49,6 +56,13 @@ func init() { cmdObjectCompliance, cmdObjectConfig, cmdObjectContainer, + cmdObjectIP, + cmdObjectFS, + cmdObjectVolume, + cmdObjectDisk, + cmdObjectShare, + cmdObjectApp, + cmdObjectTask, cmdObjectEdit, cmdObjectInstance, cmdObjectPG, @@ -95,7 +109,6 @@ func init() { cmdObjectInstance.AddCommand( cmdObjectInstanceDevice, cmdObjectInstanceSync, - cmdObjectInstanceResource, newCmdObjectInstanceBoot(kind), newCmdObjectInstanceDelete(kind), newCmdObjectInstanceFreeze(kind), @@ -120,12 +133,10 @@ func init() { cmdObjectInstancePG.AddCommand( newCmdObjectInstancePGUpdate(kind), ) - cmdObjectInstanceResource.AddCommand( - cmdObjectInstanceResourceInfo, - ) - cmdObjectInstanceResourceInfo.AddCommand( - newCmdObjectInstanceResourceInfoList(kind), - newCmdObjectInstanceResourceInfoPush(kind), + + cmdObjectResourceInfo.AddCommand( + newCmdObjectResourceInfoList(kind), + newCmdObjectResourceInfoPush(kind), ) cmdObjectInstanceSync.AddCommand( newCmdObjectInstanceSyncIngest(kind), @@ -139,6 +150,7 @@ func init() { ) cmdObjectResource.AddCommand( newCmdObjectResourceList(kind), + cmdObjectResourceInfo, ) cmdObjectConfig.AddCommand( omcmd.NewCmdObjectConfigDoc(kind), @@ -149,10 +161,66 @@ func init() { newCmdObjectConfigShow(kind), newCmdObjectConfigUpdate(kind), newCmdObjectConfigValidate(kind), + newCmdObjectContainerStart(kind), + newCmdObjectContainerStop(kind), + newCmdObjectContainerRestart(kind), + newCmdObjectContainerProvision(kind), + newCmdObjectContainerUnprovision(kind), ) cmdObjectContainer.AddCommand( newCmdObjectContainerEnter(kind), newCmdObjectContainerLogs(kind), + newCmdObjectContainerList(kind), + ) + cmdObjectIP.AddCommand( + newCmdObjectIPList(kind), + newCmdObjectIPStart(kind), + newCmdObjectIPStop(kind), + newCmdObjectIPRestart(kind), + newCmdObjectIPProvision(kind), + newCmdObjectIPUnprovision(kind), + ) + cmdObjectFS.AddCommand( + newCmdObjectFSList(kind), + newCmdObjectFSStart(kind), + newCmdObjectFSStop(kind), + newCmdObjectFSRestart(kind), + newCmdObjectFSProvision(kind), + newCmdObjectFSUnprovision(kind), + ) + cmdObjectVolume.AddCommand( + newCmdObjectVolumeList(kind), + newCmdObjectVolumeStart(kind), + newCmdObjectVolumeStop(kind), + newCmdObjectVolumeRestart(kind), + newCmdObjectVolumeProvision(kind), + newCmdObjectVolumeUnprovision(kind), + ) + cmdObjectDisk.AddCommand( + newCmdObjectDiskList(kind), + newCmdObjectDiskStart(kind), + newCmdObjectDiskStop(kind), + newCmdObjectDiskRestart(kind), + newCmdObjectDiskProvision(kind), + newCmdObjectDiskUnprovision(kind), + ) + cmdObjectShare.AddCommand( + newCmdObjectShareList(kind), + newCmdObjectShareStart(kind), + newCmdObjectShareStop(kind), + newCmdObjectShareRestart(kind), + newCmdObjectShareProvision(kind), + newCmdObjectShareUnprovision(kind), + ) + cmdObjectApp.AddCommand( + newCmdObjectAppList(kind), + newCmdObjectAppRestart(kind), + newCmdObjectAppStop(kind), + newCmdObjectAppStart(kind), + ) + cmdObjectTask.AddCommand( + newCmdObjectTaskList(kind), + newCmdObjectTaskRun(kind), ) cmdObjectEdit.AddCommand( newCmdObjectEditConfig(kind), @@ -178,11 +246,12 @@ func init() { newCmdObjectPushResourceInfo(kind), ) cmdObjectSync.AddCommand( - newCmdObjectInstanceSyncFull(kind), - newCmdObjectInstanceSyncIngest(kind), - newCmdObjectInstanceSyncResync(kind), - newCmdObjectInstanceSyncSplit(kind), - newCmdObjectInstanceSyncUpdate(kind), + newCmdObjectSyncFull(kind), + newCmdObjectSyncIngest(kind), + newCmdObjectSyncResync(kind), + newCmdObjectSyncSplit(kind), + newCmdObjectSyncUpdate(kind), + newCmdObjectSyncList(kind), ) cmdObjectValidate.AddCommand( newCmdObjectValidateConfig(kind), diff --git a/core/om/kind_ccfg.go b/core/om/kind_ccfg.go index 8ac375cc7..32c701cbc 100644 --- a/core/om/kind_ccfg.go +++ b/core/om/kind_ccfg.go @@ -8,7 +8,7 @@ import ( func init() { kind := "ccfg" - cmdObject := newCmdCcfg() + cmdObject := commoncmd.NewCmdCcfg() cmdObjectConfig := commoncmd.NewCmdObjectConfig(kind) cmdObjectEdit := newCmdObjectEdit(kind) cmdObjectSet := newCmdObjectSet(kind) diff --git a/core/om/kind_cfg.go b/core/om/kind_cfg.go index e64e3a12f..775514681 100644 --- a/core/om/kind_cfg.go +++ b/core/om/kind_cfg.go @@ -8,7 +8,7 @@ import ( func init() { kind := "cfg" - cmdObject := newCmdCfg() + cmdObject := commoncmd.NewCmdCfg() cmdObjectConfig := commoncmd.NewCmdObjectConfig(kind) cmdObjectEdit := newCmdObjectEdit(kind) cmdObjectKey := commoncmd.NewCmdObjectKey(kind) diff --git a/core/om/kind_nscfg.go b/core/om/kind_nscfg.go index e1126c805..c9b0365a0 100644 --- a/core/om/kind_nscfg.go +++ b/core/om/kind_nscfg.go @@ -1,8 +1,6 @@ package om import ( - "github.com/spf13/cobra" - "github.com/opensvc/om3/v3/core/commoncmd" "github.com/opensvc/om3/v3/core/omcmd" ) @@ -10,10 +8,7 @@ import ( func init() { kind := "nscfg" - cmdObject := &cobra.Command{ - Use: "nscfg", - Short: "manage namespace configurations", - } + cmdObject := commoncmd.NewCmdNscfg() cmdObjectConfig := commoncmd.NewCmdObjectConfig(kind) cmdObjectEdit := newCmdObjectEdit(kind) cmdObjectInstance := commoncmd.NewCmdObjectInstance(kind) diff --git a/core/om/kind_sec.go b/core/om/kind_sec.go index 8374dadd0..dbb4af475 100644 --- a/core/om/kind_sec.go +++ b/core/om/kind_sec.go @@ -8,7 +8,7 @@ import ( func init() { kind := "sec" - cmdObject := newCmdSec() + cmdObject := commoncmd.NewCmdSec() cmdObjectCertificate := newCmdObjectCertificate(kind) cmdObjectConfig := commoncmd.NewCmdObjectConfig(kind) cmdObjectEdit := newCmdObjectEdit(kind) diff --git a/core/om/kind_svc.go b/core/om/kind_svc.go index d8c673626..aeedcddef 100644 --- a/core/om/kind_svc.go +++ b/core/om/kind_svc.go @@ -9,7 +9,7 @@ import ( func init() { kind := "svc" - cmdObject := newCmdSVC() + cmdObject := commoncmd.NewCmdSVC() cmdObjectCollector := commoncmd.NewCmdObjectCollector(kind) cmdObjectCollectorTag := newCmdObjectCollectorTag(kind) cmdObjectCompliance := commoncmd.NewCmdObjectCompliance(kind) @@ -19,19 +19,26 @@ func init() { cmdObjectComplianceList := newCmdObjectComplianceList(kind) cmdObjectConfig := commoncmd.NewCmdObjectConfig(kind) cmdObjectContainer := commoncmd.NewCmdObjectContainer(kind) + cmdObjectIP := commoncmd.NewCmdObjectIP(kind) + cmdObjectFS := commoncmd.NewCmdObjectFS(kind) + cmdObjectVolume := commoncmd.NewCmdObjectVolume(kind) + cmdObjectDisk := commoncmd.NewCmdObjectDisk(kind) + cmdObjectShare := commoncmd.NewCmdObjectShare(kind) + cmdObjectApp := commoncmd.NewCmdObjectApp(kind) + cmdObjectTask := commoncmd.NewCmdObjectTask(kind) cmdObjectEdit := newCmdObjectEdit(kind) cmdObjectInstance := commoncmd.NewCmdObjectInstance(kind) cmdObjectInstanceDevice := commoncmd.NewCmdObjectInstanceDevice(kind) cmdObjectInstancePG := commoncmd.NewCmdObjectInstancePG(kind) cmdObjectInstanceSync := commoncmd.NewCmdObjectInstanceSync(kind) - cmdObjectInstanceResource := commoncmd.NewCmdObjectInstanceResource(kind) - cmdObjectInstanceResourceInfo := commoncmd.NewCmdObjectInstanceResourceInfo(kind) cmdObjectPG := commoncmd.NewCmdObjectInstancePG(kind) cmdObjectPG.Hidden = true cmdObjectPrint := newCmdObjectPrint(kind) cmdObjectPrintConfig := newCmdObjectPrintConfig(kind) cmdObjectPush := newCmdObjectPush(kind) cmdObjectResource := commoncmd.NewCmdObjectResource(kind) + cmdObjectResourceInfo := commoncmd.NewCmdObjectResourceInfo(kind) + cmdObjectResourceSync := newCmdObjectResourceSync(kind) cmdObjectSchedule := commoncmd.NewCmdObjectSchedule(kind) cmdObjectSet := newCmdObjectSet(kind) cmdObjectSync := commoncmd.NewCmdObjectSync(kind) @@ -43,6 +50,7 @@ func init() { cmdObject.AddGroup( commoncmd.NewGroupOrchestratedActions(), commoncmd.NewGroupQuery(), + commoncmd.NewGroupResources(), commoncmd.NewGroupSubsystems(), ) cmdObject.AddCommand( @@ -50,6 +58,13 @@ func init() { cmdObjectCompliance, cmdObjectConfig, cmdObjectContainer, + cmdObjectIP, + cmdObjectFS, + cmdObjectVolume, + cmdObjectDisk, + cmdObjectShare, + cmdObjectApp, + cmdObjectTask, cmdObjectEdit, cmdObjectInstance, cmdObjectPG, @@ -106,6 +121,84 @@ func init() { cmdObjectContainer.AddCommand( newCmdObjectContainerEnter(kind), newCmdObjectContainerLogs(kind), + newCmdObjectContainerList(kind), + newCmdObjectContainerPRStart(kind), + newCmdObjectContainerPRStop(kind), + newCmdObjectContainerStart(kind), + newCmdObjectContainerStartStandby(kind), + newCmdObjectContainerShutdown(kind), + newCmdObjectContainerStop(kind), + newCmdObjectContainerRestart(kind), + newCmdObjectContainerProvision(kind), + newCmdObjectContainerUnprovision(kind), + ) + cmdObjectIP.AddCommand( + newCmdObjectIPList(kind), + newCmdObjectIPStart(kind), + newCmdObjectIPStartStandby(kind), + newCmdObjectIPShutdown(kind), + newCmdObjectIPStop(kind), + newCmdObjectIPRestart(kind), + newCmdObjectIPProvision(kind), + newCmdObjectIPUnprovision(kind), + ) + cmdObjectFS.AddCommand( + newCmdObjectFSList(kind), + newCmdObjectFSProvision(kind), + newCmdObjectFSPRStart(kind), + newCmdObjectFSPRStop(kind), + newCmdObjectFSRestart(kind), + newCmdObjectFSShutdown(kind), + newCmdObjectFSStart(kind), + newCmdObjectFSStartStandby(kind), + newCmdObjectFSStop(kind), + newCmdObjectFSUnprovision(kind), + ) + cmdObjectVolume.AddCommand( + newCmdObjectVolumeList(kind), + newCmdObjectVolumeProvision(kind), + newCmdObjectVolumePRStart(kind), + newCmdObjectVolumePRStop(kind), + newCmdObjectVolumeRestart(kind), + newCmdObjectVolumeShutdown(kind), + newCmdObjectVolumeStart(kind), + newCmdObjectVolumeStartStandby(kind), + newCmdObjectVolumeStop(kind), + newCmdObjectVolumeUnprovision(kind), + ) + cmdObjectDisk.AddCommand( + newCmdObjectDiskList(kind), + newCmdObjectDiskProvision(kind), + newCmdObjectDiskPRStart(kind), + newCmdObjectDiskPRStop(kind), + newCmdObjectDiskShutdown(kind), + newCmdObjectDiskStart(kind), + newCmdObjectDiskStartStandby(kind), + newCmdObjectDiskStop(kind), + newCmdObjectDiskRestart(kind), + newCmdObjectDiskUnprovision(kind), + ) + cmdObjectShare.AddCommand( + newCmdObjectShareList(kind), + newCmdObjectShareShutdown(kind), + newCmdObjectShareStart(kind), + newCmdObjectShareStartStandby(kind), + newCmdObjectShareStop(kind), + newCmdObjectShareRestart(kind), + newCmdObjectShareProvision(kind), + newCmdObjectShareUnprovision(kind), + ) + cmdObjectApp.AddCommand( + newCmdObjectAppList(kind), + newCmdObjectAppRestart(kind), + newCmdObjectAppShutdown(kind), + newCmdObjectAppStart(kind), + newCmdObjectAppStartStandby(kind), + newCmdObjectAppStop(kind), + ) + cmdObjectTask.AddCommand( + newCmdObjectTaskList(kind), + newCmdObjectTaskRun(kind), ) cmdObjectEdit.AddCommand( newCmdObjectEditConfig(kind), @@ -115,12 +208,22 @@ func init() { ) cmdObjectResource.AddCommand( newCmdObjectResourceList(kind), + cmdObjectResourceInfo, + cmdObjectResourceSync, + newCmdObjectResourceProvision(kind), + newCmdObjectResourceUnprovision(kind), + newCmdObjectResourcePRStart(kind), + newCmdObjectResourcePRStop(kind), + newCmdObjectResourceRestart(kind), + newCmdObjectResourceRun(kind), + newCmdObjectResourceStart(kind), + newCmdObjectResourceStartStandby(kind), + newCmdObjectResourceStop(kind), ) cmdObjectInstance.AddCommand( cmdObjectInstanceDevice, cmdObjectInstancePG, cmdObjectInstanceSync, - cmdObjectInstanceResource, newCmdObjectInstanceBoot(kind), newCmdObjectInstanceDelete(kind), newCmdObjectInstanceFreeze(kind), @@ -145,12 +248,10 @@ func init() { cmdObjectInstancePG.AddCommand( newCmdObjectInstancePGUpdate(kind), ) - cmdObjectInstanceResource.AddCommand( - cmdObjectInstanceResourceInfo, - ) - cmdObjectInstanceResourceInfo.AddCommand( - newCmdObjectInstanceResourceInfoList(kind), - newCmdObjectInstanceResourceInfoPush(kind), + + cmdObjectResourceInfo.AddCommand( + newCmdObjectResourceInfoList(kind), + newCmdObjectResourceInfoPush(kind), ) cmdObjectInstanceSync.AddCommand( newCmdObjectInstanceSyncFull(kind), @@ -180,11 +281,12 @@ func init() { newCmdObjectPushResourceInfo(kind), ) cmdObjectSync.AddCommand( - newCmdObjectInstanceSyncFull(kind), - newCmdObjectInstanceSyncIngest(kind), - newCmdObjectInstanceSyncResync(kind), - newCmdObjectInstanceSyncSplit(kind), - newCmdObjectInstanceSyncUpdate(kind), + newCmdObjectSyncFull(kind), + newCmdObjectSyncIngest(kind), + newCmdObjectSyncResync(kind), + newCmdObjectSyncSplit(kind), + newCmdObjectSyncUpdate(kind), + newCmdObjectSyncList(kind), ) cmdObjectValidate.AddCommand( newCmdObjectValidateConfig(kind), diff --git a/core/om/kind_usr.go b/core/om/kind_usr.go index 6049d13d5..50e6bc7da 100644 --- a/core/om/kind_usr.go +++ b/core/om/kind_usr.go @@ -8,7 +8,7 @@ import ( func init() { kind := "usr" - cmdObject := newCmdUsr() + cmdObject := commoncmd.NewCmdUsr() cmdObjectCertificate := newCmdObjectCertificate(kind) cmdObjectConfig := commoncmd.NewCmdObjectConfig(kind) cmdObjectEdit := newCmdObjectEdit(kind) diff --git a/core/om/kind_vol.go b/core/om/kind_vol.go index e694c7f81..017b4bd35 100644 --- a/core/om/kind_vol.go +++ b/core/om/kind_vol.go @@ -9,16 +9,17 @@ import ( func init() { kind := "vol" - cmdObject := newCmdVol() + cmdObject := commoncmd.NewCmdVol() cmdObjectCollector := commoncmd.NewCmdObjectCollector(kind) cmdObjectCollectorTag := newCmdObjectCollectorTag(kind) cmdObjectEdit := newCmdObjectEdit(kind) cmdObjectConfig := commoncmd.NewCmdObjectConfig(kind) + cmdObjectVolume := commoncmd.NewCmdObjectVolume(kind) + cmdObjectDisk := commoncmd.NewCmdObjectDisk(kind) + cmdObjectFS := commoncmd.NewCmdObjectFS(kind) cmdObjectInstance := commoncmd.NewCmdObjectInstance(kind) cmdObjectInstanceDevice := commoncmd.NewCmdObjectInstanceDevice(kind) cmdObjectInstancePG := commoncmd.NewCmdObjectInstancePG(kind) - cmdObjectInstanceResource := commoncmd.NewCmdObjectInstanceResource(kind) - cmdObjectInstanceResourceInfo := commoncmd.NewCmdObjectInstanceResourceInfo(kind) cmdObjectInstanceSync := commoncmd.NewCmdObjectInstanceSync(kind) cmdObjectPG := commoncmd.NewCmdObjectInstancePG(kind) cmdObjectPG.Hidden = true @@ -26,6 +27,8 @@ func init() { cmdObjectPrintConfig := newCmdObjectPrintConfig(kind) cmdObjectPush := newCmdObjectPush(kind) cmdObjectResource := commoncmd.NewCmdObjectResource(kind) + cmdObjectResourceInfo := commoncmd.NewCmdObjectResourceInfo(kind) + cmdObjectResourceSync := newCmdObjectResourceSync(kind) cmdObjectSchedule := commoncmd.NewCmdObjectSchedule(kind) cmdObjectSet := newCmdObjectSet(kind) cmdObjectSync := commoncmd.NewCmdObjectSync(kind) @@ -37,11 +40,14 @@ func init() { cmdObject.AddGroup( commoncmd.NewGroupOrchestratedActions(), commoncmd.NewGroupQuery(), + commoncmd.NewGroupResources(), commoncmd.NewGroupSubsystems(), ) cmdObject.AddCommand( cmdObjectCollector, cmdObjectConfig, + cmdObjectFS, + cmdObjectDisk, cmdObjectEdit, cmdObjectInstance, cmdObjectPG, @@ -52,6 +58,7 @@ func init() { cmdObjectSchedule, cmdObjectSync, cmdObjectValidate, + cmdObjectVolume, newCmdObjectAbort(kind), commoncmd.NewCmdObjectClear(kind), newCmdObjectCreate(kind), @@ -82,6 +89,42 @@ func init() { newCmdObjectUnprovision(kind), newCmdObjectUnset(kind), ) + cmdObjectFS.AddCommand( + newCmdObjectFSList(kind), + newCmdObjectFSProvision(kind), + newCmdObjectFSPRStart(kind), + newCmdObjectFSPRStop(kind), + newCmdObjectFSRestart(kind), + newCmdObjectFSShutdown(kind), + newCmdObjectFSStart(kind), + newCmdObjectFSStartStandby(kind), + newCmdObjectFSStop(kind), + newCmdObjectFSUnprovision(kind), + ) + cmdObjectVolume.AddCommand( + newCmdObjectVolumeList(kind), + newCmdObjectVolumeProvision(kind), + newCmdObjectVolumePRStart(kind), + newCmdObjectVolumePRStop(kind), + newCmdObjectVolumeRestart(kind), + newCmdObjectVolumeShutdown(kind), + newCmdObjectVolumeStart(kind), + newCmdObjectVolumeStartStandby(kind), + newCmdObjectVolumeStop(kind), + newCmdObjectVolumeUnprovision(kind), + ) + cmdObjectDisk.AddCommand( + newCmdObjectDiskList(kind), + newCmdObjectDiskProvision(kind), + newCmdObjectDiskPRStart(kind), + newCmdObjectDiskPRStop(kind), + newCmdObjectDiskShutdown(kind), + newCmdObjectDiskStart(kind), + newCmdObjectDiskStartStandby(kind), + newCmdObjectDiskStop(kind), + newCmdObjectDiskRestart(kind), + newCmdObjectDiskUnprovision(kind), + ) cmdObjectCollector.AddCommand( cmdObjectCollectorTag, ) @@ -108,7 +151,6 @@ func init() { cmdObjectInstance.AddCommand( cmdObjectInstanceDevice, cmdObjectInstancePG, - cmdObjectInstanceResource, cmdObjectInstanceSync, newCmdObjectInstanceBoot(kind), newCmdObjectInstanceDelete(kind), @@ -143,13 +185,21 @@ func init() { ) cmdObjectResource.AddCommand( newCmdObjectResourceList(kind), - ) - cmdObjectInstanceResource.AddCommand( - cmdObjectInstanceResourceInfo, - ) - cmdObjectInstanceResourceInfo.AddCommand( - newCmdObjectInstanceResourceInfoList(kind), - newCmdObjectInstanceResourceInfoPush(kind), + cmdObjectResourceInfo, + cmdObjectResourceSync, + newCmdObjectResourceProvision(kind), + newCmdObjectResourceUnprovision(kind), + newCmdObjectResourcePRStart(kind), + newCmdObjectResourcePRStop(kind), + newCmdObjectResourceRestart(kind), + newCmdObjectResourceRun(kind), + newCmdObjectResourceStart(kind), + newCmdObjectResourceStartStandby(kind), + newCmdObjectResourceStop(kind), + ) + cmdObjectResourceInfo.AddCommand( + newCmdObjectResourceInfoList(kind), + newCmdObjectResourceInfoPush(kind), ) cmdObjectPG.AddCommand( newCmdObjectInstancePGUpdate(kind), @@ -175,11 +225,12 @@ func init() { newCmdObjectSetUnprovisioned(kind), ) cmdObjectSync.AddCommand( - newCmdObjectInstanceSyncFull(kind), - newCmdObjectInstanceSyncIngest(kind), - newCmdObjectInstanceSyncResync(kind), - newCmdObjectInstanceSyncSplit(kind), - newCmdObjectInstanceSyncUpdate(kind), + newCmdObjectSyncFull(kind), + newCmdObjectSyncIngest(kind), + newCmdObjectSyncResync(kind), + newCmdObjectSyncSplit(kind), + newCmdObjectSyncUpdate(kind), + newCmdObjectSyncList(kind), ) cmdObjectValidate.AddCommand( newCmdObjectValidateConfig(kind), diff --git a/core/om/network.go b/core/om/network.go index ed34b481e..4e0b2161a 100644 --- a/core/om/network.go +++ b/core/om/network.go @@ -1,20 +1,12 @@ package om import ( - "github.com/spf13/cobra" + "github.com/opensvc/om3/v3/core/commoncmd" ) var ( - cmdNetwork = &cobra.Command{ - Use: "network", - Short: "manage backend networks", - Aliases: []string{"net"}, - Long: `A backend network provides ip addresses to svc objects via ip.cni resources. These addresses are automatically allocated, accessible from all cluster nodes, and resolved by the cluster dns.`, - } - cmdNetworkIP = &cobra.Command{ - Use: "ip", - Short: "manage ip on backend networks", - } + cmdNetwork = commoncmd.NewCmdNetwork() + cmdNetworkIP = commoncmd.NewCmdNetworkIP() ) func init() { diff --git a/core/om/node.go b/core/om/node.go index b5e56c088..f7a11d024 100644 --- a/core/om/node.go +++ b/core/om/node.go @@ -10,12 +10,7 @@ import ( var ( cmdNode = commoncmd.NewCmdNode() - cmdNodeCapabilities = &cobra.Command{ - GroupID: commoncmd.GroupIDSubsystems, - Use: "capabilities", - Short: "scan and list what the node is capable of", - Aliases: []string{"capa", "caps", "cap"}, - } + cmdNodeCapabilities = commoncmd.NewCmdNodeCapabilities() cmdNodeCollector = &cobra.Command{ GroupID: commoncmd.GroupIDSubsystems, Use: "collector", @@ -27,28 +22,15 @@ var ( Use: "tag", Short: "collector tags management commands", } - cmdNodeCompliance = &cobra.Command{ - GroupID: commoncmd.GroupIDSubsystems, - Use: "compliance", - Short: "node configuration manager commands", - Aliases: []string{"comp"}, - } + cmdNodeCompliance = commoncmd.NewCmdNodeCompliance() cmdNodeConfig = &cobra.Command{ GroupID: commoncmd.GroupIDSubsystems, Use: "config", Short: "configuration commands", Aliases: []string{"conf", "c", "cf", "cfg"}, } - cmdNodeSCSI = &cobra.Command{ - GroupID: commoncmd.GroupIDSubsystems, - Use: "scsi", - Short: "scsi commands", - } - cmdNodeRelay = &cobra.Command{ - GroupID: commoncmd.GroupIDSubsystems, - Use: "relay", - Short: "relay commands", - } + cmdNodeSCSI = commoncmd.NewCmdNodeSCSI() + cmdNodeRelay = commoncmd.NewCmdNodeRelay() cmdNodeScan = &cobra.Command{ Use: "scan", Hidden: true, @@ -58,11 +40,7 @@ var ( Use: "schedule", Short: "scheduler commands", } - cmdNodeSSH = &cobra.Command{ - GroupID: commoncmd.GroupIDSubsystems, - Use: "ssh", - Short: "ssh commands", - } + cmdNodeSSH = commoncmd.NewCmdNodeSSH() // Backward compat diff --git a/core/om/pool.go b/core/om/pool.go index f799142af..27f19e5a1 100644 --- a/core/om/pool.go +++ b/core/om/pool.go @@ -1,20 +1,12 @@ package om import ( - "github.com/spf13/cobra" + "github.com/opensvc/om3/v3/core/commoncmd" ) var ( - cmdPool = &cobra.Command{ - Use: "pool", - Short: "manage storage pools", - Long: ` A pool is a vol provider. Pools abstract the hardware and software specificities of the cluster infrastructure.`, - } - cmdPoolVolume = &cobra.Command{ - Use: "volume", - Short: "manage storage pool volumes", - Aliases: []string{"vol"}, - } + cmdPool = commoncmd.NewCmdPool() + cmdPoolVolume = commoncmd.NewCmdPoolVolume() ) func init() { diff --git a/core/omcmd/object_config_get.go b/core/omcmd/object_config_get.go index a4f13688b..0b24d6b70 100644 --- a/core/omcmd/object_config_get.go +++ b/core/omcmd/object_config_get.go @@ -36,7 +36,12 @@ func (t *CmdObjectConfigGet) Run(kind string) error { return err } sel := objectselector.New(mergedSelector, objectselector.WithClient(c)) - paths, err := sel.MustExpand() + var paths naming.Paths + if t.IgnoreNotFound { + paths, err = sel.ExpandRelaxed() + } else { + paths, err = sel.MustExpand() + } if err != nil { return err } diff --git a/core/omcmd/object_resource_list.go b/core/omcmd/object_resource_list.go index afae55737..b95357e0c 100644 --- a/core/omcmd/object_resource_list.go +++ b/core/omcmd/object_resource_list.go @@ -9,6 +9,7 @@ import ( "github.com/opensvc/om3/v3/core/output" "github.com/opensvc/om3/v3/core/rawconfig" "github.com/opensvc/om3/v3/daemon/api" + "github.com/opensvc/om3/v3/util/hostname" ) type ( @@ -33,6 +34,10 @@ func (t *CmdObjectResourceList) Run(kind string) error { params := api.GetResourcesParams{Path: &mergedSelector} if t.NodeSelector != "" { params.Node = &t.NodeSelector + } else { + // Default to local node for om command + localNode := hostname.Hostname() + params.Node = &localNode } if t.RID != "" { params.Resource = &t.RID diff --git a/core/omcmd/options.go b/core/omcmd/options.go index 9be4db91b..d24a5078e 100644 --- a/core/omcmd/options.go +++ b/core/omcmd/options.go @@ -1,11 +1,10 @@ package omcmd +import "github.com/opensvc/om3/v3/core/commoncmd" + type ( // OptsGlobal contains options accepted by all actions OptsGlobal struct { - Color string - Output string - ObjectSelector string - IgnoreNotFound bool + commoncmd.OptsGlobal } ) diff --git a/core/ox/factory.go b/core/ox/factory.go index 8443a85d4..b2b742b4c 100644 --- a/core/ox/factory.go +++ b/core/ox/factory.go @@ -11,111 +11,6 @@ import ( "github.com/opensvc/om3/v3/core/tui" ) -func newCmdAll() *cobra.Command { - return &cobra.Command{ - Use: "all", - Short: "manage a mix of objects, tentatively exposing all commands", - } -} - -func newCmdCcfg() *cobra.Command { - return &cobra.Command{ - Use: "ccfg", - Short: "manage the cluster shared configuration", - Long: `The cluster nodes merge their private configuration -over the cluster shared configuration. - -The shared configuration is hosted in a ccfg-kind object, and is -replicated using the same rules as other kinds of object (last write is -eventually replicated). -`, - } -} - -func newCmdCfg() *cobra.Command { - return &cobra.Command{ - Use: "cfg", - Short: "manage configmaps", - Long: `A configmap is an unencrypted key-value store. - -Values can be binary or text. - -A key can be installed as a file in a Vol, then exposed to apps -and containers. - -A key can be exposed as a environment variable for apps and -containers. - -A signal can be sent to consumer processes upon exposed key value -changes. - -The key names can include the '/' character, interpreted as a path separator -when installing the key in a volume.`, - } -} - -func newCmdSec() *cobra.Command { - return &cobra.Command{ - Use: "sec", - Short: "manage secrets", - Long: `A secret is an encrypted key-value store. - -Values can be binary or text. - -A key can be installed as a file in a Vol, then exposed to apps -and containers. - -A key can be exposed as a environment variable for apps and -containers. - -A signal can be sent to consumer processes upon exposed key value -changes. - -The key names can include the '/' character, interpreted as a path separator -when installing the key in a volume.`, - } -} - -func newCmdSVC() *cobra.Command { - return &cobra.Command{ - Use: "svc", - Short: "manage services", - Long: `Service objects subsystem. - -A service is typically made of ip, app, container and task resources. - -They can use support objects like volumes, secrets and configmaps to -isolate lifecycles or to abstract cluster-specific knowledge. -`, - } -} - -func newCmdVol() *cobra.Command { - return &cobra.Command{ - Use: "vol", - Short: "manage volumes", - Long: `A volume is a persistent data provider. - -A volume is made of disk, fs and sync resources. It is created by a pool, -to satisfy a demand from a volume resource in a service. - -Volumes and their subdirectories can be mounted inside containers. - -A volume can host cfg and sec keys projections.`, - } -} - -func newCmdUsr() *cobra.Command { - return &cobra.Command{ - Use: "usr", - Short: "manage users", - Long: `A user stores the grants and credentials of user of the agent API. - -User objects are not necessary with OpenID authentication, as the -grants are embedded in the trusted bearer tokens.`, - } -} - func newCmdArrayList() *cobra.Command { var options commands.CmdArrayList cmd := &cobra.Command{ @@ -138,7 +33,7 @@ func newCmdDaemonEvents() *cobra.Command { Short: "print the daemon event stream", Long: "Print the daemon event stream\n\n" + commoncmd.UsageFlagEventFilter() + "\n" + commoncmd.UsageFlagEventTemplate(), - Aliases: []string{"eve", "even", "event"}, + Aliases: []string{"ev"}, RunE: func(cmd *cobra.Command, args []string) error { options.Quiet = quietFlag if options.Wait && !cmd.Flags().Changed("limit") { @@ -164,10 +59,9 @@ func newCmdDaemonEvents() *cobra.Command { func newCmdDaemonRestart() *cobra.Command { var options commands.CmdDaemonRestart cmd := &cobra.Command{ - Use: "restart", - Short: "restart the daemon", - Long: "restart the daemon. Operation is asynchronous when node selector is used", - Aliases: []string{"restart"}, + Use: "restart", + Short: "restart the daemon", + Long: "restart the daemon. Operation is asynchronous when node selector is used", RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -482,7 +376,7 @@ func newCmdNodeChecks() *cobra.Command { cmd := &cobra.Command{ Use: "checks", Short: "run the checks, push and print the result", - Aliases: []string{"check", "chec", "che", "ch"}, + Aliases: []string{"check", "chk"}, RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -512,10 +406,9 @@ func newCmdNodeCollectorTagAttach() *cobra.Command { var attachData string var options commands.CmdNodeCollectorTagAttach cmd := &cobra.Command{ - Use: "attach", - Short: "attach a tag to this node", - Long: "The tag must already exist in the collector.", - Aliases: []string{"atta", "att", "at", "a"}, + Use: "attach", + Short: "attach a tag to this node", + Long: "The tag must already exist in the collector.", RunE: func(cmd *cobra.Command, args []string) error { if cmd.Flag("attach-data").Changed { options.AttachData = &attachData @@ -561,9 +454,8 @@ func newCmdNodeCollectorTagCreate() *cobra.Command { func newCmdNodeCollectorTagDetach() *cobra.Command { var options commands.CmdNodeCollectorTagDetach cmd := &cobra.Command{ - Use: "detach", - Short: "detach a tag from this node", - Aliases: []string{"deta", "det", "de", "d"}, + Use: "detach", + Short: "detach a tag from this node", RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -612,7 +504,7 @@ func newCmdNodeComplianceAttachModuleset() *cobra.Command { Use: "moduleset", Short: "attach modulesets to this node", Long: "Modules of all attached modulesets are checked on schedule.", - Aliases: []string{"modulese", "modules", "module", "modul", "modu", "mod", "mo"}, + Aliases: []string{"modset"}, RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -627,10 +519,9 @@ func newCmdNodeComplianceAttachModuleset() *cobra.Command { func newCmdNodeComplianceAttachRuleset() *cobra.Command { var options commands.CmdNodeComplianceAttachRuleset cmd := &cobra.Command{ - Use: "ruleset", - Short: "attach rulesets to this node", - Long: "Rules of attached rulesets are exposed to modules.", - Aliases: []string{"rulese", "rules", "rule", "rul", "ru"}, + Use: "ruleset", + Short: "attach rulesets to this node", + Long: "Rules of attached rulesets are exposed to modules.", RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -667,7 +558,7 @@ func newCmdNodeComplianceCheck() *cobra.Command { cmd := &cobra.Command{ Use: "check", Short: "run modules checks", - Aliases: []string{"chec", "che", "ch"}, + Aliases: []string{"chk"}, RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -704,9 +595,8 @@ func newCmdNodeComplianceFix() *cobra.Command { func newCmdNodeComplianceFixable() *cobra.Command { var options commands.CmdNodeComplianceFixable cmd := &cobra.Command{ - Use: "fixable", - Short: "run modules fixable-tests", - Aliases: []string{"fixabl", "fixab", "fixa"}, + Use: "fixable", + Short: "run modules fixable-tests", RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -727,7 +617,7 @@ func newCmdNodeComplianceDetachModuleset() *cobra.Command { Use: "moduleset", Short: "detach modulesets from this node", Long: "Modules of attached modulesets are checked on schedule.", - Aliases: []string{"modulese", "modules", "module", "modul", "modu", "mod", "mo"}, + Aliases: []string{"modset"}, RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -742,10 +632,9 @@ func newCmdNodeComplianceDetachModuleset() *cobra.Command { func newCmdNodeComplianceDetachRuleset() *cobra.Command { var options commands.CmdNodeComplianceDetachRuleset cmd := &cobra.Command{ - Use: "ruleset", - Short: "detach rulesets from this node", - Long: "Rules of attached rulesets are made available to their module.", - Aliases: []string{"rulese", "rules", "rule", "rul", "ru"}, + Use: "ruleset", + Short: "detach rulesets from this node", + Long: "Rules of attached rulesets are made available to their module.", RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -760,9 +649,8 @@ func newCmdNodeComplianceDetachRuleset() *cobra.Command { func newCmdNodeComplianceEnv() *cobra.Command { var options commands.CmdNodeComplianceEnv cmd := &cobra.Command{ - Use: "env", - Short: "show the env variables set for modules run", - Aliases: []string{"en"}, + Use: "env", + Short: "show the env variables set for modules run", RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -778,9 +666,9 @@ func newCmdNodeComplianceEnv() *cobra.Command { func newCmdNodeComplianceListModules() *cobra.Command { var options commands.CmdNodeComplianceListModules cmd := &cobra.Command{ - Use: "modules", + Use: "module", Short: "list modules available on this node", - Aliases: []string{"module", "modul", "modu", "mod"}, + Aliases: []string{"mod", "modules"}, RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -796,7 +684,7 @@ func newCmdNodeComplianceListModuleset() *cobra.Command { cmd := &cobra.Command{ Use: "moduleset", Short: "list modulesets available to this node", - Aliases: []string{"modulesets"}, + Aliases: []string{"modset"}, RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -811,9 +699,8 @@ func newCmdNodeComplianceListModuleset() *cobra.Command { func newCmdNodeComplianceListRuleset() *cobra.Command { var options commands.CmdNodeComplianceListRuleset cmd := &cobra.Command{ - Use: "ruleset", - Short: "list rulesets available to this node", - Aliases: []string{"rulese", "rules", "rule", "rul", "ru"}, + Use: "ruleset", + Short: "list rulesets available to this node", RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -830,7 +717,7 @@ func newCmdNodeComplianceShowModuleset() *cobra.Command { cmd := &cobra.Command{ Use: "moduleset", Short: "show modulesets and modules attached to this node", - Aliases: []string{"modulese", "modules", "module", "modul", "modu", "mod", "mo"}, + Aliases: []string{"modset"}, RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -845,9 +732,8 @@ func newCmdNodeComplianceShowModuleset() *cobra.Command { func newCmdNodeComplianceShowRuleset() *cobra.Command { var options commands.CmdNodeComplianceShowRuleset cmd := &cobra.Command{ - Use: "ruleset", - Short: "show rules contextualized for this node", - Aliases: []string{"rulese", "rules", "rule", "rul", "ru"}, + Use: "ruleset", + Short: "show rules contextualized for this node", RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -1088,7 +974,7 @@ func newCmdNodeConfigEdit() *cobra.Command { cmd := &cobra.Command{ Use: "edit", Short: "edit the node configuration", - Aliases: []string{"ed", "edi"}, + Aliases: []string{"ed"}, RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -1226,7 +1112,7 @@ func newCmdNodeLogs() *cobra.Command { cmd := &cobra.Command{ GroupID: commoncmd.GroupIDQuery, Use: "logs", - Aliases: []string{"logs", "log", "lo"}, + Aliases: []string{"log"}, Short: "show this node logs", RunE: func(cmd *cobra.Command, args []string) error { return options.Run() @@ -1260,9 +1146,8 @@ func newCmdNodeList() *cobra.Command { func newCmdNodeSCSIPRKey() *cobra.Command { var options commands.CmdNodePRKey cmd := &cobra.Command{ - Use: "prkey", - Short: "show the scsi3 persistent reservation key of this node", - Aliases: []string{"prk", "prke"}, + Use: "prkey", + Short: "show the scsi3 persistent reservation key of this node", RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -1301,9 +1186,8 @@ func newCmdObjectScheduleList(kind string) *cobra.Command { func newCmdNodePushAsset() *cobra.Command { var options commands.CmdNodePushAsset cmd := &cobra.Command{ - Use: "asset", - Short: "run the node discovery, push and print the result", - Aliases: []string{"asse", "ass", "as"}, + Use: "asset", + Short: "run the node discovery, push and print the result", RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -1321,7 +1205,7 @@ func newCmdNodePushDisk() *cobra.Command { cmd := &cobra.Command{ Use: "disk", Short: "run the disk discovery, push and print the result", - Aliases: []string{"disks", "dis", "di"}, + Aliases: []string{"disks"}, RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -1337,9 +1221,8 @@ func newCmdNodePushDisk() *cobra.Command { func newCmdNodePushPkg() *cobra.Command { var options commands.CmdNodePushPkg cmd := &cobra.Command{ - Use: "pkg", - Short: "run the node installed packages discovery, push and print the result", - Aliases: []string{"pk"}, + Use: "pkg", + Short: "run the node installed packages discovery, push and print the result", RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -1358,7 +1241,7 @@ func newCmdNodeRegister() *cobra.Command { Use: "register", Short: "initial login on the collector", Long: "Obtain a registration id from the collector, store it in the node configuration node.uuid keyword. This uuid is then used to authenticate the node in collector communications.", - Aliases: []string{"registe", "regist", "regis", "regi", "reg", "re"}, + Aliases: []string{"reg"}, RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -1391,10 +1274,9 @@ func newCmdNodeRelayStatus() *cobra.Command { func newCmdNodeSysreport() *cobra.Command { var options commands.CmdNodeSysreport cmd := &cobra.Command{ - Use: "sysreport", - Short: "collect system data and push it to the collector", - Long: "Push system report to the collector for archiving and diff analysis. The --force option resend all monitored files and outputs to the collector instead of only those that changed since the last sysreport.", - Aliases: []string{"sysrepor", "sysrepo", "sysrep", "sysre", "sysr", "sys", "sy"}, + Use: "sysreport", + Short: "collect system data and push it to the collector", + Long: "Push system report to the collector for archiving and diff analysis. The --force option resend all monitored files and outputs to the collector instead of only those that changed since the last sysreport.", RunE: func(cmd *cobra.Command, args []string) error { return options.Run() }, @@ -1498,17 +1380,15 @@ func newCmdObjectCertificatePKCS(kind string) *cobra.Command { func newCmdObjectPrint(kind string) *cobra.Command { return &cobra.Command{ - Use: "print", - Short: "print information about the object", - Aliases: []string{"prin", "pri", "pr"}, + Use: "print", + Short: "print information about the object", } } func newCmdObjectPush(kind string) *cobra.Command { return &cobra.Command{ - Use: "push", - Short: "push information about the object to the collector", - Aliases: []string{"push", "pus", "pu"}, + Use: "push", + Short: "push information about the object to the collector", } } @@ -1523,10 +1403,9 @@ func newCmdObjectCollectorTagAttach(kind string) *cobra.Command { var attachData string var options commands.CmdObjectCollectorTagAttach cmd := &cobra.Command{ - Use: "attach", - Short: "attach a tag to this node", - Long: "The tag must already exist in the collector.", - Aliases: []string{"atta", "att", "at", "a"}, + Use: "attach", + Short: "attach a tag to this node", + Long: "The tag must already exist in the collector.", RunE: func(cmd *cobra.Command, args []string) error { if cmd.Flag("attach-data").Changed { options.AttachData = &attachData @@ -1544,9 +1423,8 @@ func newCmdObjectCollectorTagAttach(kind string) *cobra.Command { func newCmdObjectCollectorTagDetach(kind string) *cobra.Command { var options commands.CmdObjectCollectorTagDetach cmd := &cobra.Command{ - Use: "detach", - Short: "detach a tag from this node", - Aliases: []string{"deta", "det", "de", "d"}, + Use: "detach", + Short: "detach a tag from this node", RunE: func(cmd *cobra.Command, args []string) error { return options.Run(kind) }, @@ -1575,17 +1453,15 @@ func newCmdObjectCollectorTagShow(kind string) *cobra.Command { func newCmdObjectComplianceAttach(kind string) *cobra.Command { return &cobra.Command{ - Use: "attach", - Short: "attach modulesets and rulesets to the node", - Aliases: []string{"attac", "atta", "att", "at"}, + Use: "attach", + Short: "attach modulesets and rulesets to the node", } } func newCmdObjectComplianceDetach(kind string) *cobra.Command { return &cobra.Command{ - Use: "detach", - Short: "detach modulesets and rulesets from the node", - Aliases: []string{"detac", "deta", "det", "de"}, + Use: "detach", + Short: "detach modulesets and rulesets from the node", } } @@ -1687,256 +1563,1970 @@ func newCmdObjectConfigUpdate(kind string) *cobra.Command { return cmd } -func newCmdObjectConfigValidate(kind string) *cobra.Command { - var options commands.CmdObjectConfigValidate +func newCmdObjectConfigValidate(kind string) *cobra.Command { + var options commands.CmdObjectConfigValidate + cmd := &cobra.Command{ + Use: "validate", + Short: "verify the object configuration syntax", + Aliases: []string{"val"}, + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsLock(flags, &options.OptsLock) + return cmd +} + +func newCmdObjectComplianceAttachModuleset(kind string) *cobra.Command { + var options commands.CmdObjectComplianceAttachModuleset + cmd := &cobra.Command{ + Use: "moduleset", + Short: "attach modulesets to this object", + Long: "Modules of attached modulesets are checked on schedule.", + Aliases: []string{"modset"}, + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagModuleset(flags, &options.Moduleset) + return cmd +} + +func newCmdObjectComplianceAttachRuleset(kind string) *cobra.Command { + var options commands.CmdObjectComplianceAttachRuleset + cmd := &cobra.Command{ + Use: "ruleset", + Short: "attach rulesets to this object", + Long: "Rules of attached rulesets are exposed to modules.", + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagRuleset(flags, &options.Ruleset) + return cmd +} + +func newCmdObjectComplianceAuto(kind string) *cobra.Command { + var options commands.CmdObjectComplianceAuto + cmd := &cobra.Command{ + Use: "auto", + Short: "run modules fixes or checks", + Long: "If the module is has the 'autofix' property set, do a fix, else do a check.", + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagModule(flags, &options.Module) + commoncmd.FlagModuleset(flags, &options.Moduleset) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + commoncmd.FlagComplianceAttach(flags, &options.Attach) + commoncmd.FlagComplianceForce(flags, &options.Force) + return cmd +} + +func newCmdObjectComplianceCheck(kind string) *cobra.Command { + var options commands.CmdObjectComplianceCheck + cmd := &cobra.Command{ + Use: "check", + Short: "run modules checks", + Aliases: []string{"chk"}, + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagModule(flags, &options.Module) + commoncmd.FlagModuleset(flags, &options.Moduleset) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + commoncmd.FlagComplianceAttach(flags, &options.Attach) + commoncmd.FlagComplianceForce(flags, &options.Force) + return cmd +} + +func newCmdObjectComplianceFix(kind string) *cobra.Command { + var options commands.CmdObjectComplianceFix + cmd := &cobra.Command{ + Use: "fix", + Short: "run modules fixes", + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagModule(flags, &options.Module) + commoncmd.FlagModuleset(flags, &options.Moduleset) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + commoncmd.FlagComplianceAttach(flags, &options.Attach) + commoncmd.FlagComplianceForce(flags, &options.Force) + return cmd +} + +func newCmdObjectComplianceFixable(kind string) *cobra.Command { + var options commands.CmdObjectComplianceFixable + cmd := &cobra.Command{ + Use: "fixable", + Short: "run modules fixable-tests", + Aliases: []string{"fixabl", "fixab", "fixa"}, + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagModule(flags, &options.Module) + commoncmd.FlagModuleset(flags, &options.Moduleset) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + commoncmd.FlagComplianceAttach(flags, &options.Attach) + commoncmd.FlagComplianceForce(flags, &options.Force) + return cmd +} + +func newCmdObjectComplianceDetachModuleset(kind string) *cobra.Command { + var options commands.CmdObjectComplianceDetachModuleset + cmd := &cobra.Command{ + Use: "moduleset", + Short: "detach modulesets from this object", + Long: "Modules of attached modulesets are checked on schedule.", + Aliases: []string{"modset"}, + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagModuleset(flags, &options.Moduleset) + return cmd +} + +func newCmdObjectComplianceDetachRuleset(kind string) *cobra.Command { + var options commands.CmdObjectComplianceDetachRuleset + cmd := &cobra.Command{ + Use: "ruleset", + Short: "detach rulesets from this object", + Long: "Rules of attached rulesets are made available to their module.", + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagRuleset(flags, &options.Ruleset) + return cmd +} + +func newCmdObjectComplianceEnv(kind string) *cobra.Command { + var options commands.CmdObjectComplianceEnv + cmd := &cobra.Command{ + Use: "env", + Short: "show the env variables set for a module run", + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagModuleset(flags, &options.Moduleset) + commoncmd.FlagModule(flags, &options.Module) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + return cmd +} + +func newCmdObjectComplianceListModules(kind string) *cobra.Command { + var options commands.CmdObjectComplianceListModules + cmd := &cobra.Command{ + Use: "modules", + Short: "list modules available on this object", + Aliases: []string{"mod"}, + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + return cmd +} + +func newCmdObjectComplianceListModuleset(kind string) *cobra.Command { + var options commands.CmdObjectComplianceListModuleset + cmd := &cobra.Command{ + Use: "moduleset", + Short: "list modulesets available to this object", + Aliases: []string{"modulesets", "modset"}, + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagModuleset(flags, &options.Moduleset) + return cmd +} + +func newCmdObjectComplianceListRuleset(kind string) *cobra.Command { + var options commands.CmdObjectComplianceListRuleset + cmd := &cobra.Command{ + Use: "ruleset", + Short: "list rulesets available to this object", + Aliases: []string{"rulesets"}, + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagRuleset(flags, &options.Ruleset) + return cmd +} + +func newCmdObjectComplianceShowModuleset(kind string) *cobra.Command { + var options commands.CmdObjectComplianceShowModuleset + cmd := &cobra.Command{ + Use: "moduleset", + Short: "show modulesets and modules attached to this object", + Aliases: []string{"modset"}, + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagModuleset(flags, &options.Moduleset) + return cmd +} + +func newCmdObjectComplianceShowRuleset(kind string) *cobra.Command { + var options commands.CmdObjectComplianceShowRuleset + cmd := &cobra.Command{ + Use: "ruleset", + Short: "show rules contextualized for to this object", + Aliases: []string{"rulese", "rules", "rule", "rul", "ru"}, + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + return cmd +} + +func newCmdObjectContainerLogs(kind string) *cobra.Command { + var options commands.CmdObjectContainerLogs + cmd := &cobra.Command{ + Use: "logs [ID]", + Aliases: []string{"log"}, + Short: "show container logs", + Long: "Show container logs. Specify a container ID as a positional argument or let om select the container if unambiguous.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "container#" + args[0] + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + commoncmd.FlagRIDWithCompletion(cmd, &options.RID) + flags.BoolVarP(&options.Follow, "follow", "f", false, "follow log output") + flags.IntVarP(&options.Lines, "lines", "n", 100, "number of lines to show") + return cmd +} + +func newCmdObjectContainerList(kind string) *cobra.Command { + var options commands.CmdObjectResourceList + options.RID = "container" + cmd := &cobra.Command{ + Use: "list", + Aliases: []string{"ls"}, + Short: "list container resources", + Long: "List container resources. Equivalent to 'resource ls --rid container'.", + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + return cmd +} + +func newCmdObjectIPList(kind string) *cobra.Command { + var options commands.CmdObjectResourceList + options.RID = "ip" + cmd := &cobra.Command{ + Use: "list", + Aliases: []string{"ls"}, + Short: "list ip resources", + Long: "List ip resources. Equivalent to 'resource ls --rid ip'.", + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + return cmd +} + +func newCmdObjectFSList(kind string) *cobra.Command { + var options commands.CmdObjectResourceList + options.RID = "fs" + cmd := &cobra.Command{ + Use: "list", + Aliases: []string{"ls"}, + Short: "list fs resources", + Long: "List fs resources. Equivalent to 'resource ls --rid fs'.", + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + return cmd +} + +func newCmdObjectVolumeList(kind string) *cobra.Command { + var options commands.CmdObjectResourceList + options.RID = "volume" + cmd := &cobra.Command{ + Use: "list", + Aliases: []string{"ls"}, + Short: "list volume resources", + Long: "List volume resources. Equivalent to 'resource ls --rid volume'.", + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + return cmd +} + +func newCmdObjectDiskList(kind string) *cobra.Command { + var options commands.CmdObjectResourceList + options.RID = "disk" + cmd := &cobra.Command{ + Use: "list", + Aliases: []string{"ls"}, + Short: "list disk resources", + Long: "List disk resources. Equivalent to 'resource ls --rid disk'.", + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + return cmd +} + +func newCmdObjectShareList(kind string) *cobra.Command { + var options commands.CmdObjectResourceList + options.RID = "share" + cmd := &cobra.Command{ + Use: "list", + Aliases: []string{"ls"}, + Short: "list share resources", + Long: "List share resources. Equivalent to 'resource ls --rid share'.", + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + return cmd +} + +func newCmdObjectAppList(kind string) *cobra.Command { + var options commands.CmdObjectResourceList + options.RID = "app" + cmd := &cobra.Command{ + Use: "list", + Aliases: []string{"ls"}, + Short: "list app resources", + Long: "List app resources. Equivalent to 'resource ls --rid app'.", + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + return cmd +} + +func newCmdObjectDriverList(kind string) *cobra.Command { + var options commands.CmdObjectResourceList + options.RID = "driver" + cmd := &cobra.Command{ + Use: "list", + Aliases: []string{"ls"}, + Short: "list driver resources", + Long: "List driver resources. Equivalent to 'resource ls --rid driver'.", + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + return cmd +} + +func newCmdObjectGroupsList(kind string) *cobra.Command { + var options commands.CmdObjectResourceList + options.RID = "groups" + cmd := &cobra.Command{ + Use: "list", + Aliases: []string{"ls"}, + Short: "list groups resources", + Long: "List groups resources. Equivalent to 'resource ls --rid groups'.", + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + return cmd +} + +func newCmdObjectContainerStart(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStart + cmd := &cobra.Command{ + Use: "start [ID]", + Short: "start a container resource", + Long: "Start a container resource. Specify a container ID as a positional argument. Equivalent to 'instance start --rid container#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "container#" + args[0] + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") + return cmd +} + +func newCmdObjectContainerStop(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStop + cmd := &cobra.Command{ + Use: "stop [ID]", + Short: "stop a container resource", + Long: "Stop a container resource. Specify a container ID as a positional argument. Equivalent to 'instance stop --rid container#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "container#" + args[0] + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagMoveTo(flags, &options.MoveTo) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") + return cmd +} + +func newCmdObjectContainerRestart(kind string) *cobra.Command { + var options commands.CmdObjectInstanceRestart + cmd := &cobra.Command{ + Use: "restart [ID]", + Short: "restart a container resource", + Long: "Restart a container resource. Specify a container ID as a positional argument. Equivalent to 'instance restart --rid container#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "container#" + args[0] + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") + return cmd +} + +func newCmdObjectContainerProvision(kind string) *cobra.Command { + var options commands.CmdObjectInstanceProvision + cmd := &cobra.Command{ + Use: "provision [ID]", + Short: "provision a container resource", + Long: "Provision a container resource. Specify a container ID as a positional argument. Equivalent to 'instance provision --rid container#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "container#" + args[0] + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagLeader(flags, &options.Leader) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + commoncmd.HiddenFlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagStateOnly(flags, &options.StateOnly) + return cmd +} + +func newCmdObjectContainerUnprovision(kind string) *cobra.Command { + var options commands.CmdObjectInstanceUnprovision + cmd := &cobra.Command{ + Use: "unprovision [ID]", + Short: "unprovision a container resource", + Long: "Unprovision a container resource. Specify a container ID as a positional argument. Equivalent to 'instance unprovision --rid container#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "container#" + args[0] + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagLeader(flags, &options.Leader) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + commoncmd.FlagStateOnly(flags, &options.StateOnly) + return cmd +} + +func newCmdObjectIPStart(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStart + cmd := &cobra.Command{ + Use: "start [ID]", + Short: "start an ip resource", + Long: "Start an ip resource. Specify an ip ID as a positional argument. Equivalent to 'instance start --rid ip#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "ip#" + args[0] + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") + return cmd +} + +func newCmdObjectIPStop(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStop + cmd := &cobra.Command{ + Use: "stop [ID]", + Short: "stop an ip resource", + Long: "Stop an ip resource. Specify an ip ID as a positional argument. Equivalent to 'instance stop --rid ip#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "ip#" + args[0] + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagMoveTo(flags, &options.MoveTo) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") + return cmd +} + +func newCmdObjectIPRestart(kind string) *cobra.Command { + var options commands.CmdObjectInstanceRestart + cmd := &cobra.Command{ + Use: "restart [ID]", + Short: "restart an ip resource", + Long: "Restart an ip resource. Specify an ip ID as a positional argument. Equivalent to 'instance restart --rid ip#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "ip#" + args[0] + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") + return cmd +} + +func newCmdObjectIPProvision(kind string) *cobra.Command { + var options commands.CmdObjectInstanceProvision + cmd := &cobra.Command{ + Use: "provision [ID]", + Short: "provision an ip resource", + Long: "Provision an ip resource. Specify an ip ID as a positional argument. Equivalent to 'instance provision --rid ip#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "ip#" + args[0] + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagLeader(flags, &options.Leader) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + commoncmd.HiddenFlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagStateOnly(flags, &options.StateOnly) + return cmd +} + +func newCmdObjectIPUnprovision(kind string) *cobra.Command { + var options commands.CmdObjectInstanceUnprovision + cmd := &cobra.Command{ + Use: "unprovision [ID]", + Short: "unprovision an ip resource", + Long: "Unprovision an ip resource. Specify an ip ID as a positional argument. Equivalent to 'instance unprovision --rid ip#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "ip#" + args[0] + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagLeader(flags, &options.Leader) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + commoncmd.FlagStateOnly(flags, &options.StateOnly) + return cmd +} + +func newCmdObjectFSStart(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStart + cmd := &cobra.Command{ + Use: "start [ID]", + Short: "start a fs resource", + Long: "Start a fs resource. Specify a fs ID as a positional argument. Equivalent to 'instance start --rid fs#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "fs#" + args[0] + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") + return cmd +} + +func newCmdObjectFSStop(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStop + cmd := &cobra.Command{ + Use: "stop [ID]", + Short: "stop a fs resource", + Long: "Stop a fs resource. Specify a fs ID as a positional argument. Equivalent to 'instance stop --rid fs#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "fs#" + args[0] + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagMoveTo(flags, &options.MoveTo) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") + return cmd +} + +func newCmdObjectFSRestart(kind string) *cobra.Command { + var options commands.CmdObjectInstanceRestart + cmd := &cobra.Command{ + Use: "restart [ID]", + Short: "restart a fs resource", + Long: "Restart a fs resource. Specify a fs ID as a positional argument. Equivalent to 'instance restart --rid fs#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "fs#" + args[0] + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") + return cmd +} + +func newCmdObjectFSProvision(kind string) *cobra.Command { + var options commands.CmdObjectInstanceProvision + cmd := &cobra.Command{ + Use: "provision [ID]", + Short: "provision a fs resource", + Long: "Provision a fs resource. Specify a fs ID as a positional argument. Equivalent to 'instance provision --rid fs#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "fs#" + args[0] + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagLeader(flags, &options.Leader) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + commoncmd.HiddenFlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagStateOnly(flags, &options.StateOnly) + return cmd +} + +func newCmdObjectFSUnprovision(kind string) *cobra.Command { + var options commands.CmdObjectInstanceUnprovision + cmd := &cobra.Command{ + Use: "unprovision [ID]", + Short: "unprovision a fs resource", + Long: "Unprovision a fs resource. Specify a fs ID as a positional argument. Equivalent to 'instance unprovision --rid fs#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "fs#" + args[0] + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagLeader(flags, &options.Leader) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + commoncmd.FlagStateOnly(flags, &options.StateOnly) + return cmd +} + +func newCmdObjectFSPRStart(kind string) *cobra.Command { + var options commands.CmdObjectInstancePRStart + cmd := &cobra.Command{ + Use: "prstart [ID]", + Short: "preempt devices exclusive write access reservation for a fs resource", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "fs#" + args[0] + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + return cmd +} + +func newCmdObjectFSPRStop(kind string) *cobra.Command { + var options commands.CmdObjectInstancePRStop + cmd := &cobra.Command{ + Use: "prstop [ID]", + Short: "release devices exclusive write access reservation for a fs resource", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "fs#" + args[0] + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + return cmd +} + +func newCmdObjectFSShutdown(kind string) *cobra.Command { + var options commands.CmdObjectInstanceShutdown + cmd := &cobra.Command{ + Use: "shutdown [ID]", + Short: "shutdown a fs resource", + Long: "Shutdown a fs resource. Specify a fs ID as a positional argument. Equivalent to 'instance shutdown --rid fs#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "fs#" + args[0] + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + return cmd +} + +func newCmdObjectFSStartStandby(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStartStandby + cmd := &cobra.Command{ + Use: "startstandby [ID]", + Short: "start a fs resource in standby mode", + Long: "Start a fs resource in standby mode. Specify a fs ID as a positional argument. Equivalent to 'instance startstandby --rid fs#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "fs#" + args[0] + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + return cmd +} + +func newCmdObjectVolumeStart(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStart + cmd := &cobra.Command{ + Use: "start [ID]", + Short: "start a volume resource", + Long: "Start a volume resource. Specify a volume ID as a positional argument. Equivalent to 'instance start --rid volume#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "volume#" + args[0] + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") + return cmd +} + +func newCmdObjectVolumeStop(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStop + cmd := &cobra.Command{ + Use: "stop [ID]", + Short: "stop a volume resource", + Long: "Stop a volume resource. Specify a volume ID as a positional argument. Equivalent to 'instance stop --rid volume#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "volume#" + args[0] + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagMoveTo(flags, &options.MoveTo) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") + return cmd +} + +func newCmdObjectVolumeRestart(kind string) *cobra.Command { + var options commands.CmdObjectInstanceRestart + cmd := &cobra.Command{ + Use: "restart [ID]", + Short: "restart a volume resource", + Long: "Restart a volume resource. Specify a volume ID as a positional argument. Equivalent to 'instance restart --rid volume#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "volume#" + args[0] + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") + return cmd +} + +func newCmdObjectVolumeProvision(kind string) *cobra.Command { + var options commands.CmdObjectInstanceProvision + cmd := &cobra.Command{ + Use: "provision [ID]", + Short: "provision a volume resource", + Long: "Provision a volume resource. Specify a volume ID as a positional argument. Equivalent to 'instance provision --rid volume#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "volume#" + args[0] + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagLeader(flags, &options.Leader) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + commoncmd.HiddenFlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagStateOnly(flags, &options.StateOnly) + return cmd +} + +func newCmdObjectVolumeUnprovision(kind string) *cobra.Command { + var options commands.CmdObjectInstanceUnprovision + cmd := &cobra.Command{ + Use: "unprovision [ID]", + Short: "unprovision a volume resource", + Long: "Unprovision a volume resource. Specify a volume ID as a positional argument. Equivalent to 'instance unprovision --rid volume#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "volume#" + args[0] + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagLeader(flags, &options.Leader) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + commoncmd.FlagStateOnly(flags, &options.StateOnly) + return cmd +} + +func newCmdObjectVolumePRStart(kind string) *cobra.Command { + var options commands.CmdObjectInstancePRStart + cmd := &cobra.Command{ + Use: "prstart [ID]", + Short: "preempt devices exclusive write access reservation for a volume resource", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "volume#" + args[0] + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + return cmd +} + +func newCmdObjectVolumePRStop(kind string) *cobra.Command { + var options commands.CmdObjectInstancePRStop + cmd := &cobra.Command{ + Use: "prstop [ID]", + Short: "release devices exclusive write access reservation for a volume resource", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "volume#" + args[0] + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + return cmd +} + +func newCmdObjectVolumeShutdown(kind string) *cobra.Command { + var options commands.CmdObjectInstanceShutdown + cmd := &cobra.Command{ + Use: "shutdown [ID]", + Short: "shutdown a volume resource", + Long: "Shutdown a volume resource. Specify a volume ID as a positional argument. Equivalent to 'instance shutdown --rid volume#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "volume#" + args[0] + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + return cmd +} + +func newCmdObjectVolumeStartStandby(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStartStandby + cmd := &cobra.Command{ + Use: "startstandby [ID]", + Short: "start a volume resource in standby mode", + Long: "Start a volume resource in standby mode. Specify a volume ID as a positional argument. Equivalent to 'instance startstandby --rid volume#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "volume#" + args[0] + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + return cmd +} + +func newCmdObjectDiskStart(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStart + cmd := &cobra.Command{ + Use: "start [ID]", + Short: "start a disk resource", + Long: "Start a disk resource. Specify a disk ID as a positional argument. Equivalent to 'instance start --rid disk#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "disk#" + args[0] + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") + return cmd +} + +func newCmdObjectDiskStop(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStop + cmd := &cobra.Command{ + Use: "stop [ID]", + Short: "stop a disk resource", + Long: "Stop a disk resource. Specify a disk ID as a positional argument. Equivalent to 'instance stop --rid disk#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "disk#" + args[0] + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagMoveTo(flags, &options.MoveTo) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") + return cmd +} + +func newCmdObjectDiskRestart(kind string) *cobra.Command { + var options commands.CmdObjectInstanceRestart + cmd := &cobra.Command{ + Use: "restart [ID]", + Short: "restart a disk resource", + Long: "Restart a disk resource. Specify a disk ID as a positional argument. Equivalent to 'instance restart --rid disk#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "disk#" + args[0] + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") + return cmd +} + +func newCmdObjectDiskProvision(kind string) *cobra.Command { + var options commands.CmdObjectInstanceProvision + cmd := &cobra.Command{ + Use: "provision [ID]", + Short: "provision a disk resource", + Long: "Provision a disk resource. Specify a disk ID as a positional argument. Equivalent to 'instance provision --rid disk#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "disk#" + args[0] + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagLeader(flags, &options.Leader) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + commoncmd.HiddenFlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagStateOnly(flags, &options.StateOnly) + return cmd +} + +func newCmdObjectDiskUnprovision(kind string) *cobra.Command { + var options commands.CmdObjectInstanceUnprovision + cmd := &cobra.Command{ + Use: "unprovision [ID]", + Short: "unprovision a disk resource", + Long: "Unprovision a disk resource. Specify a disk ID as a positional argument. Equivalent to 'instance unprovision --rid disk#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "disk#" + args[0] + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagLeader(flags, &options.Leader) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + commoncmd.FlagStateOnly(flags, &options.StateOnly) + return cmd +} + +func newCmdObjectDiskPRStart(kind string) *cobra.Command { + var options commands.CmdObjectInstancePRStart + cmd := &cobra.Command{ + Use: "prstart [ID]", + Short: "preempt devices exclusive write access reservation for a disk resource", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "disk#" + args[0] + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + return cmd +} + +func newCmdObjectDiskPRStop(kind string) *cobra.Command { + var options commands.CmdObjectInstancePRStop + cmd := &cobra.Command{ + Use: "prstop [ID]", + Short: "release devices exclusive write access reservation for a disk resource", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "disk#" + args[0] + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + return cmd +} + +func newCmdObjectDiskShutdown(kind string) *cobra.Command { + var options commands.CmdObjectInstanceShutdown + cmd := &cobra.Command{ + Use: "shutdown [ID]", + Short: "shutdown a disk resource", + Long: "Shutdown a disk resource. Specify a disk ID as a positional argument. Equivalent to 'instance shutdown --rid disk#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "disk#" + args[0] + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + return cmd +} + +func newCmdObjectDiskStartStandby(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStartStandby + cmd := &cobra.Command{ + Use: "startstandby [ID]", + Short: "start a disk resource in standby mode", + Long: "Start a disk resource in standby mode. Specify a disk ID as a positional argument. Equivalent to 'instance startstandby --rid disk#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "disk#" + args[0] + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + return cmd +} + +func newCmdObjectShareStart(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStart + cmd := &cobra.Command{ + Use: "start [ID]", + Short: "start a share resource", + Long: "Start a share resource. Specify a share ID as a positional argument. Equivalent to 'instance start --rid share#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "share#" + args[0] + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") + return cmd +} + +func newCmdObjectShareStop(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStop + cmd := &cobra.Command{ + Use: "stop [ID]", + Short: "stop a share resource", + Long: "Stop a share resource. Specify a share ID as a positional argument. Equivalent to 'instance stop --rid share#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "share#" + args[0] + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagMoveTo(flags, &options.MoveTo) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") + return cmd +} + +func newCmdObjectShareRestart(kind string) *cobra.Command { + var options commands.CmdObjectInstanceRestart + cmd := &cobra.Command{ + Use: "restart [ID]", + Short: "restart a share resource", + Long: "Restart a share resource. Specify a share ID as a positional argument. Equivalent to 'instance restart --rid share#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "share#" + args[0] + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") + return cmd +} + +func newCmdObjectShareProvision(kind string) *cobra.Command { + var options commands.CmdObjectInstanceProvision + cmd := &cobra.Command{ + Use: "provision [ID]", + Short: "provision a share resource", + Long: "Provision a share resource. Specify a share ID as a positional argument. Equivalent to 'instance provision --rid share#'.", + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "share#" + args[0] + } + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagLeader(flags, &options.Leader) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + commoncmd.HiddenFlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagStateOnly(flags, &options.StateOnly) + return cmd +} + +func newCmdObjectShareUnprovision(kind string) *cobra.Command { + var options commands.CmdObjectInstanceUnprovision cmd := &cobra.Command{ - Use: "validate", - Short: "verify the object configuration syntax", - Aliases: []string{"val"}, + Use: "unprovision [ID]", + Short: "unprovision a share resource", + Long: "Unprovision a share resource. Specify a share ID as a positional argument. Equivalent to 'instance unprovision --rid share#'.", + Args: cobra.MaximumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "share#" + args[0] + } return options.Run(kind) }, } flags := cmd.Flags() addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagLeader(flags, &options.Leader) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + commoncmd.FlagStateOnly(flags, &options.StateOnly) return cmd } -func newCmdObjectComplianceAttachModuleset(kind string) *cobra.Command { - var options commands.CmdObjectComplianceAttachModuleset +func newCmdObjectShareShutdown(kind string) *cobra.Command { + var options commands.CmdObjectInstanceShutdown cmd := &cobra.Command{ - Use: "moduleset", - Short: "attach modulesets to this object", - Long: "Modules of attached modulesets are checked on schedule.", - Aliases: []string{"modulese", "modules", "module", "modul", "modu", "mod", "mo"}, + Use: "shutdown [ID]", + Short: "shutdown a share resource", + Long: "Shutdown a share resource. Specify a share ID as a positional argument. Equivalent to 'instance shutdown --rid share#'.", + Args: cobra.MaximumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "share#" + args[0] + } return options.Run(kind) }, } flags := cmd.Flags() addFlagsGlobal(flags, &options.OptsGlobal) - commoncmd.FlagModuleset(flags, &options.Moduleset) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) return cmd } -func newCmdObjectComplianceAttachRuleset(kind string) *cobra.Command { - var options commands.CmdObjectComplianceAttachRuleset +func newCmdObjectShareStartStandby(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStartStandby cmd := &cobra.Command{ - Use: "ruleset", - Short: "attach rulesets to this object", - Long: "Rules of attached rulesets are exposed to modules.", - Aliases: []string{"rulese", "rules", "rule", "rul", "ru"}, + Use: "startstandby [ID]", + Short: "start a share resource in standby mode", + Long: "Start a share resource in standby mode. Specify a share ID as a positional argument. Equivalent to 'instance startstandby --rid share#'.", + Args: cobra.MaximumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "share#" + args[0] + } return options.Run(kind) }, } flags := cmd.Flags() addFlagsGlobal(flags, &options.OptsGlobal) - commoncmd.FlagRuleset(flags, &options.Ruleset) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) return cmd } -func newCmdObjectComplianceAuto(kind string) *cobra.Command { - var options commands.CmdObjectComplianceAuto +func newCmdObjectAppStart(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStart cmd := &cobra.Command{ - Use: "auto", - Short: "run modules fixes or checks", - Long: "If the module is has the 'autofix' property set, do a fix, else do a check.", + Use: "start [ID]", + Short: "start an app resource", + Long: "Start an app resource. Specify an app ID as a positional argument. Equivalent to 'instance start --rid app#'.", + Args: cobra.MaximumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "app#" + args[0] + } return options.Run(kind) }, } flags := cmd.Flags() addFlagsGlobal(flags, &options.OptsGlobal) - commoncmd.FlagModule(flags, &options.Module) - commoncmd.FlagModuleset(flags, &options.Moduleset) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) commoncmd.FlagNodeSelector(flags, &options.NodeSelector) - commoncmd.FlagComplianceAttach(flags, &options.Attach) - commoncmd.FlagComplianceForce(flags, &options.Force) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") return cmd } -func newCmdObjectComplianceCheck(kind string) *cobra.Command { - var options commands.CmdObjectComplianceCheck +func newCmdObjectAppStop(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStop cmd := &cobra.Command{ - Use: "check", - Short: "run modules checks", - Aliases: []string{"chec", "che", "ch"}, + Use: "stop [ID]", + Short: "stop an app resource", + Long: "Stop an app resource. Specify an app ID as a positional argument. Equivalent to 'instance stop --rid app#'.", + Args: cobra.MaximumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "app#" + args[0] + } return options.Run(kind) }, } flags := cmd.Flags() addFlagsGlobal(flags, &options.OptsGlobal) - commoncmd.FlagModule(flags, &options.Module) - commoncmd.FlagModuleset(flags, &options.Moduleset) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagMoveTo(flags, &options.MoveTo) commoncmd.FlagNodeSelector(flags, &options.NodeSelector) - commoncmd.FlagComplianceAttach(flags, &options.Attach) - commoncmd.FlagComplianceForce(flags, &options.Force) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") return cmd } -func newCmdObjectComplianceFix(kind string) *cobra.Command { - var options commands.CmdObjectComplianceFix +func newCmdObjectAppRestart(kind string) *cobra.Command { + var options commands.CmdObjectInstanceRestart cmd := &cobra.Command{ - Use: "fix", - Short: "run modules fixes", + Use: "restart [ID]", + Short: "restart an app resource", + Long: "Restart an app resource. Specify an app ID as a positional argument. Equivalent to 'instance restart --rid app#'.", + Args: cobra.MaximumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "app#" + args[0] + } return options.Run(kind) }, } flags := cmd.Flags() addFlagsGlobal(flags, &options.OptsGlobal) - commoncmd.FlagModule(flags, &options.Module) - commoncmd.FlagModuleset(flags, &options.Moduleset) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) commoncmd.FlagNodeSelector(flags, &options.NodeSelector) - commoncmd.FlagComplianceAttach(flags, &options.Attach) - commoncmd.FlagComplianceForce(flags, &options.Force) + cmd.MarkFlagsMutuallyExclusive("no-lock", "node") + cmd.MarkFlagsMutuallyExclusive("waitlock", "node") return cmd } -func newCmdObjectComplianceFixable(kind string) *cobra.Command { - var options commands.CmdObjectComplianceFixable +func newCmdObjectAppShutdown(kind string) *cobra.Command { + var options commands.CmdObjectInstanceShutdown cmd := &cobra.Command{ - Use: "fixable", - Short: "run modules fixable-tests", - Aliases: []string{"fixabl", "fixab", "fixa"}, + Use: "shutdown [ID]", + Short: "shutdown an app resource", + Long: "Shutdown an app resource. Specify an app ID as a positional argument. Equivalent to 'instance shutdown --rid app#'.", + Args: cobra.MaximumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "app#" + args[0] + } return options.Run(kind) }, } flags := cmd.Flags() addFlagsGlobal(flags, &options.OptsGlobal) - commoncmd.FlagModule(flags, &options.Module) - commoncmd.FlagModuleset(flags, &options.Moduleset) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) commoncmd.FlagNodeSelector(flags, &options.NodeSelector) - commoncmd.FlagComplianceAttach(flags, &options.Attach) - commoncmd.FlagComplianceForce(flags, &options.Force) return cmd } -func newCmdObjectComplianceDetachModuleset(kind string) *cobra.Command { - var options commands.CmdObjectComplianceDetachModuleset +func newCmdObjectAppStartStandby(kind string) *cobra.Command { + var options commands.CmdObjectInstanceStartStandby cmd := &cobra.Command{ - Use: "moduleset", - Short: "detach modulesets from this object", - Long: "Modules of attached modulesets are checked on schedule.", - Aliases: []string{"modulese", "modules", "module", "modul", "modu", "mod", "mo"}, + Use: "startstandby [ID]", + Short: "start an app resource in standby mode", + Long: "Start an app resource in standby mode. Specify an app ID as a positional argument. Equivalent to 'instance startstandby --rid app#'.", + Args: cobra.MaximumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "app#" + args[0] + } return options.Run(kind) }, } flags := cmd.Flags() addFlagsGlobal(flags, &options.OptsGlobal) - commoncmd.FlagModuleset(flags, &options.Moduleset) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagDisableRollback(flags, &options.DisableRollback) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) return cmd } -func newCmdObjectComplianceDetachRuleset(kind string) *cobra.Command { - var options commands.CmdObjectComplianceDetachRuleset +func newCmdObjectTaskRun(kind string) *cobra.Command { + var options commands.CmdObjectInstanceRun cmd := &cobra.Command{ - Use: "ruleset", - Short: "detach rulesets from this object", - Long: "Rules of attached rulesets are made available to their module.", - Aliases: []string{"rulese", "rules", "rule", "rul", "ru"}, + Use: "run [ID]", + Short: "execute a task resource", + Long: "Execute a task resource. Specify a task ID as a positional argument or let om select the task if unambiguous.", + Args: cobra.MaximumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "task#" + args[0] + } return options.Run(kind) }, } flags := cmd.Flags() addFlagsGlobal(flags, &options.OptsGlobal) - commoncmd.FlagRuleset(flags, &options.Ruleset) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsEncap(flags, &options.OptsEncap) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagsTo(flags, &options.OptTo) + commoncmd.FlagConfirm(flags, &options.Confirm) + commoncmd.FlagCron(flags, &options.Cron) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + commoncmd.FlagEnv(flags, &options.Env) return cmd } -func newCmdObjectComplianceEnv(kind string) *cobra.Command { - var options commands.CmdObjectComplianceEnv +func newCmdObjectSyncUpdate(kind string) *cobra.Command { + var options commands.CmdObjectInstanceSyncUpdate cmd := &cobra.Command{ - Use: "env", - Short: "show the env variables set for a module run", - Aliases: []string{"en"}, + Use: "update [ID]", + Short: "synchronize the copy of the local dataset on peers", + Long: "Execute a sync update action. Specify a sync ID as a positional argument or let om select the sync if unambiguous.", + Args: cobra.MaximumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "sync#" + args[0] + } return options.Run(kind) }, } flags := cmd.Flags() addFlagsGlobal(flags, &options.OptsGlobal) - commoncmd.FlagModuleset(flags, &options.Moduleset) - commoncmd.FlagModule(flags, &options.Module) - commoncmd.FlagNodeSelector(flags, &options.NodeSelector) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagTarget(flags, &options.Target) return cmd } -func newCmdObjectComplianceListModules(kind string) *cobra.Command { - var options commands.CmdObjectComplianceListModules +func newCmdObjectSyncFull(kind string) *cobra.Command { + var options commands.CmdObjectInstanceSyncFull cmd := &cobra.Command{ - Use: "modules", - Short: "list modules available on this object", - Aliases: []string{"module", "modul", "modu", "mod"}, + Use: "full [ID]", + Short: "full copy of the local dataset on peers", + Long: "Execute a sync full action. Specify a sync ID as a positional argument or let om select the sync if unambiguous.", + Args: cobra.MaximumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "sync#" + args[0] + } return options.Run(kind) }, } flags := cmd.Flags() addFlagsGlobal(flags, &options.OptsGlobal) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagForce(flags, &options.Force) + commoncmd.FlagTarget(flags, &options.Target) return cmd } -func newCmdObjectComplianceListModuleset(kind string) *cobra.Command { - var options commands.CmdObjectComplianceListModuleset +func newCmdObjectSyncIngest(kind string) *cobra.Command { + var options commands.CmdObjectInstanceSyncIngest cmd := &cobra.Command{ - Use: "moduleset", - Short: "list modulesets available to this object", - Aliases: []string{"modulesets"}, + Use: "ingest [ID]", + Short: "ingest files received from the active instance", + Long: "Execute a sync ingest action. Specify a sync ID as a positional argument or let om select the sync if unambiguous.", + Args: cobra.MaximumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "sync#" + args[0] + } return options.Run(kind) }, } flags := cmd.Flags() addFlagsGlobal(flags, &options.OptsGlobal) - commoncmd.FlagModuleset(flags, &options.Moduleset) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) return cmd } -func newCmdObjectComplianceListRuleset(kind string) *cobra.Command { - var options commands.CmdObjectComplianceListRuleset +func newCmdObjectSyncResync(kind string) *cobra.Command { + var options commands.CmdObjectInstanceSyncResync cmd := &cobra.Command{ - Use: "ruleset", - Short: "list rulesets available to this object", - Aliases: []string{"rulese", "rules", "rule", "rul", "ru"}, + Use: "resync [ID]", + Short: "restore optimal synchronization", + Long: "Execute a sync resync action. Specify a sync ID as a positional argument or let om select the sync if unambiguous.", + Args: cobra.MaximumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "sync#" + args[0] + } return options.Run(kind) }, } flags := cmd.Flags() addFlagsGlobal(flags, &options.OptsGlobal) - commoncmd.FlagRuleset(flags, &options.Ruleset) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagForce(flags, &options.Force) return cmd } -func newCmdObjectComplianceShowModuleset(kind string) *cobra.Command { - var options commands.CmdObjectComplianceShowModuleset +func newCmdObjectSyncSplit(kind string) *cobra.Command { + var options commands.CmdObjectInstanceSyncSplit cmd := &cobra.Command{ - Use: "moduleset", - Short: "show modulesets and modules attached to this object", - Aliases: []string{"modulese", "modules", "module", "modul", "modu", "mod", "mo"}, + Use: "split [ID]", + Short: "make both ends of a replicated pair read-write", + Long: "Execute a sync split action. Specify a sync ID as a positional argument or let om select the sync if unambiguous.", + Args: cobra.MaximumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "sync#" + args[0] + } return options.Run(kind) }, } flags := cmd.Flags() addFlagsGlobal(flags, &options.OptsGlobal) - commoncmd.FlagModuleset(flags, &options.Moduleset) + commoncmd.FlagsAsync(flags, &options.OptsAsync) + commoncmd.FlagsLock(flags, &options.OptsLock) + commoncmd.FlagsResourceSelector(cmd, &options.OptsResourceSelector) + commoncmd.FlagForce(flags, &options.Force) return cmd } -func newCmdObjectComplianceShowRuleset(kind string) *cobra.Command { - var options commands.CmdObjectComplianceShowRuleset +func newCmdObjectSyncList(kind string) *cobra.Command { + var options commands.CmdObjectResourceList + options.RID = "sync" cmd := &cobra.Command{ - Use: "ruleset", - Short: "show rules contextualized for to this object", - Aliases: []string{"rulese", "rules", "rule", "rul", "ru"}, + Use: "list", + Aliases: []string{"ls"}, + Short: "list sync resources", + Long: "List sync resources. Equivalent to 'resource ls --rid sync'.", RunE: func(cmd *cobra.Command, args []string) error { return options.Run(kind) }, @@ -1947,12 +3537,14 @@ func newCmdObjectComplianceShowRuleset(kind string) *cobra.Command { return cmd } -func newCmdObjectContainerLogs(kind string) *cobra.Command { - var options commands.CmdObjectContainerLogs +func newCmdObjectTaskList(kind string) *cobra.Command { + var options commands.CmdObjectResourceList + options.RID = "task" cmd := &cobra.Command{ - Use: "logs", - Aliases: []string{"log"}, - Short: "show container logs", + Use: "list", + Aliases: []string{"ls"}, + Short: "list task resources", + Long: "List task resources. Equivalent to 'resource ls --rid task'.", RunE: func(cmd *cobra.Command, args []string) error { return options.Run(kind) }, @@ -1960,9 +3552,6 @@ func newCmdObjectContainerLogs(kind string) *cobra.Command { flags := cmd.Flags() addFlagsGlobal(flags, &options.OptsGlobal) commoncmd.FlagNodeSelector(flags, &options.NodeSelector) - commoncmd.FlagRIDWithCompletion(cmd, &options.RID) - flags.BoolVarP(&options.Follow, "follow", "f", false, "follow log output") - flags.IntVarP(&options.Lines, "lines", "n", 100, "number of lines to show") return cmd } @@ -2074,10 +3663,14 @@ func newCmdObjectEnable(kind string) *cobra.Command { func newCmdObjectContainerEnter(kind string) *cobra.Command { var options commands.CmdObjectContainerEnter cmd := &cobra.Command{ - Use: "enter", + Use: "enter [ID]", Short: "open a shell in a container resource", - Long: "Enter any container resource if --rid is not set.", + Long: "Enter any container resource. Specify a container ID as a positional argument or let om select the container if unambiguous.", + Args: cobra.MaximumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + options.RID = "container#" + args[0] + } return options.Run(kind) }, } @@ -2473,7 +4066,7 @@ func newCmdObjectInstanceStatus(kind string) *cobra.Command { var options commands.CmdObjectInstanceStatus cmd := &cobra.Command{ Use: "status", - Aliases: []string{"statu", "stat", "sta", "st"}, + Aliases: []string{"stat"}, Short: "print the object instances status", Long: `Resources Flags: @@ -2706,7 +4299,7 @@ func newCmdObjectInstanceSyncUpdate(kind string) *cobra.Command { return cmd } -func newCmdObjectInstanceResourceInfoList(kind string) *cobra.Command { +func newCmdObjectResourceInfoList(kind string) *cobra.Command { var options commands.CmdObjectInstanceResourceInfoList cmd := &cobra.Command{ Use: "list", @@ -2722,7 +4315,7 @@ func newCmdObjectInstanceResourceInfoList(kind string) *cobra.Command { return cmd } -func newCmdObjectInstanceResourceInfoPush(kind string) *cobra.Command { +func newCmdObjectResourceInfoPush(kind string) *cobra.Command { var options commands.CmdObjectInstanceResourceInfoPush cmd := &cobra.Command{ Use: "push", @@ -3043,7 +4636,7 @@ func newCmdNodeEditConfig() *cobra.Command { cmd := newCmdNodeConfigEdit() cmd.Hidden = true cmd.Use = "config" - cmd.Aliases = []string{"confi", "conf", "con", "co", "c", "cf", "cfg"} + cmd.Aliases = []string{"conf", "cf", "cfg"} return cmd } @@ -3063,7 +4656,7 @@ func newCmdNodePrintConfig() *cobra.Command { cmd := newCmdNodeConfigShow() cmd.Hidden = true cmd.Use = "config" - cmd.Aliases = []string{"conf", "co", "cf", "cfg"} + cmd.Aliases = []string{"conf", "cf", "cfg"} return cmd } @@ -3128,7 +4721,7 @@ func newCmdNodeValidateConfig() *cobra.Command { cmd := newCmdNodeConfigValidate() cmd.Hidden = true cmd.Use = "config" - cmd.Aliases = []string{"confi", "conf", "con", "co", "c"} + cmd.Aliases = []string{"conf", "cf", "cfg"} return cmd } @@ -3148,7 +4741,7 @@ func newCmdObjectPrintConfig(kind string) *cobra.Command { cmd := newCmdObjectConfigShow(kind) cmd.Hidden = true cmd.Use = "config" - cmd.Aliases = []string{"conf", "co", "cf", "cfg"} + cmd.Aliases = []string{"conf", "cf", "cfg"} return cmd } @@ -3730,7 +5323,19 @@ func NewCmdContextShow() *cobra.Command { } func newCmdObjectEnter(kind string) *cobra.Command { - cmd := newCmdObjectContainerEnter(kind) + var options commands.CmdObjectContainerEnter + cmd := &cobra.Command{ + Use: "enter", + Short: "open a shell in a container resource", + Long: "Enter any container resource. Use --rid to specify which container to enter.", + RunE: func(cmd *cobra.Command, args []string) error { + return options.Run(kind) + }, + } + flags := cmd.Flags() + addFlagObject(flags, &options.ObjectSelector) + commoncmd.FlagRIDWithCompletion(cmd, &options.RID) + commoncmd.FlagNodeSelector(flags, &options.NodeSelector) cmd.Hidden = true return cmd } diff --git a/core/ox/flags.go b/core/ox/flags.go index 4fa81d957..94902dca1 100644 --- a/core/ox/flags.go +++ b/core/ox/flags.go @@ -11,10 +11,7 @@ import ( ) func addFlagsGlobal(flagSet *pflag.FlagSet, p *commands.OptsGlobal) { - flagSet.StringVar(&p.Color, "color", "auto", "output colorization yes|no|auto") - flagSet.StringVarP(&p.Output, "output", "o", "auto", "output format json|flat|auto|tab=
:,...") - flagSet.StringVarP(&p.ObjectSelector, "selector", "s", "", "execute on a list of objects") - commoncmd.FlagIgnoreNotFound(flagSet, &p.IgnoreNotFound) + commoncmd.AddFlagsGlobal(flagSet, &p.OptsGlobal) } func addFlagObject(flagSet *pflag.FlagSet, p *string) { diff --git a/core/ox/kind_all.go b/core/ox/kind_all.go index 4bb64875a..e40547f19 100644 --- a/core/ox/kind_all.go +++ b/core/ox/kind_all.go @@ -4,7 +4,7 @@ import "github.com/opensvc/om3/v3/core/commoncmd" func init() { kind := "" - cmdObject := newCmdAll() + cmdObject := commoncmd.NewCmdAll() cmdObjectCollector := commoncmd.NewCmdObjectCollector(kind) cmdObjectCollectorTag := newCmdObjectCollectorTag(kind) cmdObjectCompliance := commoncmd.NewCmdObjectCompliance(kind) @@ -16,19 +16,26 @@ func init() { cmdObjectInstance := commoncmd.NewCmdObjectInstance(kind) cmdObjectInstanceDevice := commoncmd.NewCmdObjectInstanceDevice(kind) cmdObjectInstancePG := commoncmd.NewCmdObjectInstancePG(kind) - cmdObjectInstanceResource := commoncmd.NewCmdObjectInstanceResource(kind) cmdObjectPG := commoncmd.NewCmdObjectInstancePG(kind) cmdObjectPG.Hidden = true - cmdObjectInstanceResourceInfo := commoncmd.NewCmdObjectInstanceResourceInfo(kind) cmdObjectInstanceSync := commoncmd.NewCmdObjectInstanceSync(kind) cmdObjectSchedule := newCmdObjectSchedule(kind) cmdObjectSet := newCmdObjectSet(kind) cmdObjectConfig := commoncmd.NewCmdObjectConfig(kind) cmdObjectContainer := commoncmd.NewCmdObjectContainer(kind) + cmdObjectIP := commoncmd.NewCmdObjectIP(kind) + cmdObjectFS := commoncmd.NewCmdObjectFS(kind) + cmdObjectVolume := commoncmd.NewCmdObjectVolume(kind) + cmdObjectDisk := commoncmd.NewCmdObjectDisk(kind) + cmdObjectShare := commoncmd.NewCmdObjectShare(kind) + cmdObjectApp := commoncmd.NewCmdObjectApp(kind) + cmdObjectTask := commoncmd.NewCmdObjectTask(kind) cmdObjectPrint := newCmdObjectPrint(kind) cmdObjectPrintConfig := newCmdObjectPrintConfig(kind) cmdObjectResource := commoncmd.NewCmdObjectResource(kind) + cmdObjectResourceInfo := commoncmd.NewCmdObjectResourceInfo(kind) cmdObjectPush := newCmdObjectPush(kind) + cmdObjectSync := commoncmd.NewCmdObjectSync(kind) cmdObjectValidate := newCmdObjectValidate(kind) root.AddCommand( @@ -37,6 +44,7 @@ func init() { cmdObject.AddGroup( commoncmd.NewGroupOrchestratedActions(), commoncmd.NewGroupQuery(), + commoncmd.NewGroupResources(), commoncmd.NewGroupSubsystems(), ) cmdObject.AddCommand( @@ -44,6 +52,13 @@ func init() { cmdObjectCompliance, cmdObjectConfig, cmdObjectContainer, + cmdObjectIP, + cmdObjectFS, + cmdObjectVolume, + cmdObjectDisk, + cmdObjectShare, + cmdObjectApp, + cmdObjectTask, cmdObjectEdit, cmdObjectInstance, cmdObjectPG, @@ -52,6 +67,7 @@ func init() { cmdObjectResource, cmdObjectSet, cmdObjectSchedule, + cmdObjectSync, cmdObjectValidate, newCmdDataStoreAdd(kind), newCmdDataStoreChange(kind), @@ -92,7 +108,6 @@ func init() { cmdObjectInstance.AddCommand( cmdObjectInstanceDevice, cmdObjectInstancePG, - cmdObjectInstanceResource, cmdObjectInstanceSync, newCmdObjectInstanceBoot(kind), newCmdObjectInstanceDelete(kind), @@ -118,12 +133,10 @@ func init() { cmdObjectInstancePG.AddCommand( newCmdObjectInstancePGUpdate(kind), ) - cmdObjectInstanceResource.AddCommand( - cmdObjectInstanceResourceInfo, - ) - cmdObjectInstanceResourceInfo.AddCommand( - newCmdObjectInstanceResourceInfoList(kind), - newCmdObjectInstanceResourceInfoPush(kind), + + cmdObjectResourceInfo.AddCommand( + newCmdObjectResourceInfoList(kind), + newCmdObjectResourceInfoPush(kind), ) cmdObjectInstanceSync.AddCommand( newCmdObjectInstanceSyncIngest(kind), @@ -132,8 +145,17 @@ func init() { newCmdObjectInstanceSyncSplit(kind), newCmdObjectInstanceSyncUpdate(kind), ) + cmdObjectSync.AddCommand( + newCmdObjectSyncFull(kind), + newCmdObjectSyncIngest(kind), + newCmdObjectSyncResync(kind), + newCmdObjectSyncSplit(kind), + newCmdObjectSyncUpdate(kind), + newCmdObjectSyncList(kind), + ) cmdObjectResource.AddCommand( newCmdObjectResourceList(kind), + cmdObjectResourceInfo, ) cmdObjectConfig.AddCommand( commoncmd.NewCmdObjectConfigDoc(kind), @@ -147,6 +169,29 @@ func init() { cmdObjectContainer.AddCommand( newCmdObjectContainerEnter(kind), newCmdObjectContainerLogs(kind), + newCmdObjectContainerList(kind), + ) + cmdObjectIP.AddCommand( + newCmdObjectIPList(kind), + ) + cmdObjectFS.AddCommand( + newCmdObjectFSList(kind), + ) + cmdObjectVolume.AddCommand( + newCmdObjectVolumeList(kind), + ) + cmdObjectDisk.AddCommand( + newCmdObjectDiskList(kind), + ) + cmdObjectShare.AddCommand( + newCmdObjectShareList(kind), + ) + cmdObjectApp.AddCommand( + newCmdObjectAppList(kind), + ) + cmdObjectTask.AddCommand( + newCmdObjectTaskList(kind), + newCmdObjectTaskRun(kind), ) cmdObjectEdit.AddCommand( newCmdObjectEditConfig(kind), diff --git a/core/ox/kind_ccfg.go b/core/ox/kind_ccfg.go index f42ab83e2..f3e6655ae 100644 --- a/core/ox/kind_ccfg.go +++ b/core/ox/kind_ccfg.go @@ -5,7 +5,7 @@ import "github.com/opensvc/om3/v3/core/commoncmd" func init() { kind := "ccfg" - cmdObject := newCmdCcfg() + cmdObject := commoncmd.NewCmdCcfg() cmdObjectConfig := commoncmd.NewCmdObjectConfig(kind) cmdObjectEdit := newCmdObjectEdit(kind) cmdObjectSet := newCmdObjectSet(kind) diff --git a/core/ox/kind_cfg.go b/core/ox/kind_cfg.go index 87ab60698..4eca391d0 100644 --- a/core/ox/kind_cfg.go +++ b/core/ox/kind_cfg.go @@ -5,7 +5,7 @@ import "github.com/opensvc/om3/v3/core/commoncmd" func init() { kind := "cfg" - cmdObject := newCmdCfg() + cmdObject := commoncmd.NewCmdCfg() cmdObjectConfig := commoncmd.NewCmdObjectConfig(kind) cmdObjectEdit := newCmdObjectEdit(kind) cmdObjectKey := commoncmd.NewCmdObjectKey(kind) diff --git a/core/ox/kind_nscfg.go b/core/ox/kind_nscfg.go index 18cc718d7..aa706011a 100644 --- a/core/ox/kind_nscfg.go +++ b/core/ox/kind_nscfg.go @@ -1,8 +1,6 @@ package ox import ( - "github.com/spf13/cobra" - "github.com/opensvc/om3/v3/core/commoncmd" "github.com/opensvc/om3/v3/core/omcmd" ) @@ -10,10 +8,7 @@ import ( func init() { kind := "nscfg" - cmdObject := &cobra.Command{ - Use: "nscfg", - Short: "manage namespace configurations", - } + cmdObject := commoncmd.NewCmdNscfg() cmdObjectConfig := commoncmd.NewCmdObjectConfig(kind) cmdObjectEdit := newCmdObjectEdit(kind) cmdObjectInstance := commoncmd.NewCmdObjectInstance(kind) diff --git a/core/ox/kind_sec.go b/core/ox/kind_sec.go index f0c358750..6dc31bac6 100644 --- a/core/ox/kind_sec.go +++ b/core/ox/kind_sec.go @@ -5,7 +5,7 @@ import "github.com/opensvc/om3/v3/core/commoncmd" func init() { kind := "sec" - cmdObject := newCmdSec() + cmdObject := commoncmd.NewCmdSec() cmdObjectCertificate := newCmdObjectCertificate(kind) cmdObjectConfig := commoncmd.NewCmdObjectConfig(kind) cmdObjectEdit := newCmdObjectEdit(kind) diff --git a/core/ox/kind_svc.go b/core/ox/kind_svc.go index 286ba9743..12965e396 100644 --- a/core/ox/kind_svc.go +++ b/core/ox/kind_svc.go @@ -5,7 +5,7 @@ import "github.com/opensvc/om3/v3/core/commoncmd" func init() { kind := "svc" - cmdObject := newCmdSVC() + cmdObject := commoncmd.NewCmdSVC() cmdObjectCollector := commoncmd.NewCmdObjectCollector(kind) cmdObjectCollectorTag := newCmdObjectCollectorTag(kind) cmdObjectCompliance := commoncmd.NewCmdObjectCompliance(kind) @@ -15,17 +15,24 @@ func init() { cmdObjectComplianceList := newCmdObjectComplianceList(kind) cmdObjectConfig := commoncmd.NewCmdObjectConfig(kind) cmdObjectContainer := commoncmd.NewCmdObjectContainer(kind) + cmdObjectIP := commoncmd.NewCmdObjectIP(kind) + cmdObjectFS := commoncmd.NewCmdObjectFS(kind) + cmdObjectVolume := commoncmd.NewCmdObjectVolume(kind) + cmdObjectDisk := commoncmd.NewCmdObjectDisk(kind) + cmdObjectShare := commoncmd.NewCmdObjectShare(kind) + cmdObjectApp := commoncmd.NewCmdObjectApp(kind) + cmdObjectTask := commoncmd.NewCmdObjectTask(kind) cmdObjectEdit := newCmdObjectEdit(kind) cmdObjectInstance := commoncmd.NewCmdObjectInstance(kind) cmdObjectInstanceDevice := commoncmd.NewCmdObjectInstanceDevice(kind) cmdObjectInstancePG := commoncmd.NewCmdObjectInstancePG(kind) - cmdObjectInstanceResource := commoncmd.NewCmdObjectInstanceResource(kind) cmdObjectPG := commoncmd.NewCmdObjectInstancePG(kind) cmdObjectPG.Hidden = true - cmdObjectInstanceResourceInfo := commoncmd.NewCmdObjectInstanceResourceInfo(kind) cmdObjectInstanceSync := commoncmd.NewCmdObjectInstanceSync(kind) cmdObjectSchedule := newCmdObjectSchedule(kind) cmdObjectResource := commoncmd.NewCmdObjectResource(kind) + cmdObjectResourceInfo := commoncmd.NewCmdObjectResourceInfo(kind) + cmdObjectSync := commoncmd.NewCmdObjectSync(kind) cmdObjectSet := newCmdObjectSet(kind) cmdObjectPrint := newCmdObjectPrint(kind) cmdObjectPrintConfig := newCmdObjectPrintConfig(kind) @@ -38,6 +45,7 @@ func init() { cmdObject.AddGroup( commoncmd.NewGroupOrchestratedActions(), commoncmd.NewGroupQuery(), + commoncmd.NewGroupResources(), commoncmd.NewGroupSubsystems(), ) cmdObject.AddCommand( @@ -45,6 +53,13 @@ func init() { cmdObjectCompliance, cmdObjectConfig, cmdObjectContainer, + cmdObjectIP, + cmdObjectFS, + cmdObjectVolume, + cmdObjectDisk, + cmdObjectShare, + cmdObjectApp, + cmdObjectTask, cmdObjectEdit, cmdObjectInstance, cmdObjectPG, @@ -53,6 +68,7 @@ func init() { cmdObjectResource, cmdObjectSet, cmdObjectSchedule, + cmdObjectSync, cmdObjectValidate, newCmdObjectAbort(kind), commoncmd.NewCmdObjectClear(kind), @@ -97,6 +113,72 @@ func init() { cmdObjectContainer.AddCommand( newCmdObjectContainerEnter(kind), newCmdObjectContainerLogs(kind), + newCmdObjectContainerList(kind), + newCmdObjectContainerStart(kind), + newCmdObjectContainerStop(kind), + newCmdObjectContainerRestart(kind), + newCmdObjectContainerProvision(kind), + newCmdObjectContainerUnprovision(kind), + ) + cmdObjectIP.AddCommand( + newCmdObjectIPList(kind), + newCmdObjectIPStart(kind), + newCmdObjectIPStop(kind), + newCmdObjectIPRestart(kind), + newCmdObjectIPProvision(kind), + newCmdObjectIPUnprovision(kind), + ) + cmdObjectFS.AddCommand( + newCmdObjectFSList(kind), + newCmdObjectFSStart(kind), + newCmdObjectFSStop(kind), + newCmdObjectFSRestart(kind), + newCmdObjectFSProvision(kind), + newCmdObjectFSUnprovision(kind), + ) + cmdObjectVolume.AddCommand( + newCmdObjectVolumeList(kind), + newCmdObjectVolumeProvision(kind), + newCmdObjectVolumeShutdown(kind), + newCmdObjectVolumeStart(kind), + newCmdObjectVolumeStartStandby(kind), + newCmdObjectVolumeStop(kind), + newCmdObjectVolumeRestart(kind), + newCmdObjectVolumeUnprovision(kind), + ) + cmdObjectDisk.AddCommand( + newCmdObjectDiskList(kind), + newCmdObjectDiskProvision(kind), + newCmdObjectDiskPRStart(kind), + newCmdObjectDiskShutdown(kind), + newCmdObjectDiskPRStop(kind), + newCmdObjectDiskStart(kind), + newCmdObjectDiskStartStandby(kind), + newCmdObjectDiskStop(kind), + newCmdObjectDiskRestart(kind), + newCmdObjectDiskUnprovision(kind), + ) + cmdObjectShare.AddCommand( + newCmdObjectShareList(kind), + newCmdObjectShareShutdown(kind), + newCmdObjectShareStart(kind), + newCmdObjectShareStartStandby(kind), + newCmdObjectShareStop(kind), + newCmdObjectShareRestart(kind), + newCmdObjectShareProvision(kind), + newCmdObjectShareUnprovision(kind), + ) + cmdObjectApp.AddCommand( + newCmdObjectAppList(kind), + newCmdObjectAppShutdown(kind), + newCmdObjectAppStart(kind), + newCmdObjectAppStartStandby(kind), + newCmdObjectAppStop(kind), + newCmdObjectAppRestart(kind), + ) + cmdObjectTask.AddCommand( + newCmdObjectTaskList(kind), + newCmdObjectTaskRun(kind), ) cmdObjectEdit.AddCommand( newCmdObjectEditConfig(kind), @@ -106,11 +188,11 @@ func init() { ) cmdObjectResource.AddCommand( newCmdObjectResourceList(kind), + cmdObjectResourceInfo, ) cmdObjectInstance.AddCommand( cmdObjectInstanceDevice, cmdObjectInstancePG, - cmdObjectInstanceResource, cmdObjectInstanceSync, newCmdObjectInstanceBoot(kind), newCmdObjectInstanceDelete(kind), @@ -136,12 +218,10 @@ func init() { cmdObjectInstancePG.AddCommand( newCmdObjectInstancePGUpdate(kind), ) - cmdObjectInstanceResource.AddCommand( - cmdObjectInstanceResourceInfo, - ) - cmdObjectInstanceResourceInfo.AddCommand( - newCmdObjectInstanceResourceInfoList(kind), - newCmdObjectInstanceResourceInfoPush(kind), + + cmdObjectResourceInfo.AddCommand( + newCmdObjectResourceInfoList(kind), + newCmdObjectResourceInfoPush(kind), ) cmdObjectInstanceSync.AddCommand( newCmdObjectInstanceSyncIngest(kind), @@ -150,6 +230,14 @@ func init() { newCmdObjectInstanceSyncSplit(kind), newCmdObjectInstanceSyncUpdate(kind), ) + cmdObjectSync.AddCommand( + newCmdObjectSyncFull(kind), + newCmdObjectSyncIngest(kind), + newCmdObjectSyncResync(kind), + newCmdObjectSyncSplit(kind), + newCmdObjectSyncUpdate(kind), + newCmdObjectSyncList(kind), + ) cmdObjectSchedule.AddCommand( newCmdObjectScheduleList(kind), ) diff --git a/core/ox/kind_usr.go b/core/ox/kind_usr.go index 3c070e040..b1181383d 100644 --- a/core/ox/kind_usr.go +++ b/core/ox/kind_usr.go @@ -5,7 +5,7 @@ import "github.com/opensvc/om3/v3/core/commoncmd" func init() { kind := "usr" - cmdObject := newCmdUsr() + cmdObject := commoncmd.NewCmdUsr() cmdObjectCertificate := newCmdObjectCertificate(kind) cmdObjectConfig := commoncmd.NewCmdObjectConfig(kind) cmdObjectEdit := newCmdObjectEdit(kind) diff --git a/core/ox/kind_vol.go b/core/ox/kind_vol.go index 2432a5938..85d8c5951 100644 --- a/core/ox/kind_vol.go +++ b/core/ox/kind_vol.go @@ -5,18 +5,19 @@ import "github.com/opensvc/om3/v3/core/commoncmd" func init() { kind := "vol" - cmdObject := newCmdVol() + cmdObject := commoncmd.NewCmdVol() cmdObjectCollector := commoncmd.NewCmdObjectCollector(kind) cmdObjectCollectorTag := newCmdObjectCollectorTag(kind) cmdObjectConfig := commoncmd.NewCmdObjectConfig(kind) + cmdObjectFS := commoncmd.NewCmdObjectFS(kind) + cmdObjectVolume := commoncmd.NewCmdObjectVolume(kind) + cmdObjectDisk := commoncmd.NewCmdObjectDisk(kind) cmdObjectEdit := newCmdObjectEdit(kind) cmdObjectInstance := commoncmd.NewCmdObjectInstance(kind) cmdObjectInstanceDevice := commoncmd.NewCmdObjectInstanceDevice(kind) cmdObjectInstancePG := commoncmd.NewCmdObjectInstancePG(kind) - cmdObjectInstanceResource := commoncmd.NewCmdObjectInstanceResource(kind) cmdObjectPG := commoncmd.NewCmdObjectInstancePG(kind) cmdObjectPG.Hidden = true - cmdObjectInstanceResourceInfo := commoncmd.NewCmdObjectInstanceResourceInfo(kind) cmdObjectInstanceSync := commoncmd.NewCmdObjectInstanceSync(kind) cmdObjectSchedule := newCmdObjectSchedule(kind) cmdObjectSet := newCmdObjectSet(kind) @@ -24,6 +25,7 @@ func init() { cmdObjectPrintConfig := newCmdObjectPrintConfig(kind) cmdObjectPush := newCmdObjectPush(kind) cmdObjectResource := commoncmd.NewCmdObjectResource(kind) + cmdObjectResourceInfo := commoncmd.NewCmdObjectResourceInfo(kind) cmdObjectValidate := newCmdObjectValidate(kind) root.AddCommand( @@ -32,11 +34,15 @@ func init() { cmdObject.AddGroup( commoncmd.NewGroupOrchestratedActions(), commoncmd.NewGroupQuery(), + commoncmd.NewGroupResources(), commoncmd.NewGroupSubsystems(), ) cmdObject.AddCommand( cmdObjectCollector, cmdObjectConfig, + cmdObjectFS, + cmdObjectVolume, + cmdObjectDisk, cmdObjectEdit, cmdObjectInstance, cmdObjectPG, @@ -74,6 +80,42 @@ func init() { newCmdObjectUpdate(kind), newCmdTUI(kind), ) + cmdObjectFS.AddCommand( + newCmdObjectFSList(kind), + newCmdObjectFSProvision(kind), + newCmdObjectFSPRStart(kind), + newCmdObjectFSPRStop(kind), + newCmdObjectFSRestart(kind), + newCmdObjectFSShutdown(kind), + newCmdObjectFSStart(kind), + newCmdObjectFSStartStandby(kind), + newCmdObjectFSStop(kind), + newCmdObjectFSUnprovision(kind), + ) + cmdObjectVolume.AddCommand( + newCmdObjectVolumeList(kind), + newCmdObjectVolumeProvision(kind), + newCmdObjectVolumePRStart(kind), + newCmdObjectVolumePRStop(kind), + newCmdObjectVolumeRestart(kind), + newCmdObjectVolumeShutdown(kind), + newCmdObjectVolumeStart(kind), + newCmdObjectVolumeStartStandby(kind), + newCmdObjectVolumeStop(kind), + newCmdObjectVolumeUnprovision(kind), + ) + cmdObjectDisk.AddCommand( + newCmdObjectDiskList(kind), + newCmdObjectDiskProvision(kind), + newCmdObjectDiskPRStart(kind), + newCmdObjectDiskPRStop(kind), + newCmdObjectDiskShutdown(kind), + newCmdObjectDiskStart(kind), + newCmdObjectDiskStartStandby(kind), + newCmdObjectDiskStop(kind), + newCmdObjectDiskRestart(kind), + newCmdObjectDiskUnprovision(kind), + ) cmdObjectCollector.AddCommand( cmdObjectCollectorTag, ) @@ -100,7 +142,6 @@ func init() { cmdObjectInstance.AddCommand( cmdObjectInstanceDevice, cmdObjectInstancePG, - cmdObjectInstanceResource, cmdObjectInstanceSync, newCmdObjectInstanceBoot(kind), newCmdObjectInstanceDelete(kind), @@ -126,12 +167,10 @@ func init() { cmdObjectInstancePG.AddCommand( newCmdObjectInstancePGUpdate(kind), ) - cmdObjectInstanceResource.AddCommand( - cmdObjectInstanceResourceInfo, - ) - cmdObjectInstanceResourceInfo.AddCommand( - newCmdObjectInstanceResourceInfoList(kind), - newCmdObjectInstanceResourceInfoPush(kind), + + cmdObjectResourceInfo.AddCommand( + newCmdObjectResourceInfoList(kind), + newCmdObjectResourceInfoPush(kind), ) cmdObjectInstanceSync.AddCommand( newCmdObjectInstanceSyncIngest(kind), @@ -142,6 +181,7 @@ func init() { ) cmdObjectResource.AddCommand( newCmdObjectResourceList(kind), + cmdObjectResourceInfo, ) cmdObjectSchedule.AddCommand( newCmdObjectScheduleList(kind), diff --git a/core/ox/network.go b/core/ox/network.go index 1bc9daea1..88ad62c4d 100644 --- a/core/ox/network.go +++ b/core/ox/network.go @@ -1,20 +1,12 @@ package ox import ( - "github.com/spf13/cobra" + "github.com/opensvc/om3/v3/core/commoncmd" ) var ( - cmdNetwork = &cobra.Command{ - Use: "network", - Short: "manage backend networks", - Aliases: []string{"net"}, - Long: `A backend network provides ip addresses to svc objects via ip.cni resources. These addresses are automatically allocated, accessible from all cluster nodes, and resolved by the cluster dns.`, - } - cmdNetworkIP = &cobra.Command{ - Use: "ip", - Short: "manage ip on backend networks", - } + cmdNetwork = commoncmd.NewCmdNetwork() + cmdNetworkIP = commoncmd.NewCmdNetworkIP() ) func init() { diff --git a/core/ox/node.go b/core/ox/node.go index 5d701c917..2508f0cc0 100644 --- a/core/ox/node.go +++ b/core/ox/node.go @@ -8,50 +8,28 @@ import ( var ( cmdNode = commoncmd.NewCmdNode() - cmdNodeCapabilities = &cobra.Command{ - GroupID: commoncmd.GroupIDSubsystems, - Use: "capabilities", - Short: "scan and list what the node is capable of", - Aliases: []string{"capa", "caps", "cap"}, - } + cmdNodeCapabilities = commoncmd.NewCmdNodeCapabilities() cmdNodeCollector = &cobra.Command{ GroupID: commoncmd.GroupIDSubsystems, Use: "collector", Short: "node collector data management commands", Aliases: []string{"coll"}, } - cmdNodeSCSI = &cobra.Command{ - GroupID: commoncmd.GroupIDSubsystems, - Use: "scsi", - Short: "scsi commands", - } + cmdNodeSCSI = commoncmd.NewCmdNodeSCSI() cmdNodeCollectorTag = &cobra.Command{ GroupID: commoncmd.GroupIDSubsystems, Use: "tag", Short: "collector tags commands", } - cmdNodeCompliance = &cobra.Command{ - GroupID: commoncmd.GroupIDSubsystems, - Use: "compliance", - Short: "node configuration manager commands", - Aliases: []string{"comp"}, - } - cmdNodeRelay = &cobra.Command{ - GroupID: commoncmd.GroupIDSubsystems, - Use: "relay", - Short: "relay commands", - } + cmdNodeCompliance = commoncmd.NewCmdNodeCompliance() + cmdNodeRelay = commoncmd.NewCmdNodeRelay() cmdNodeSchedule = &cobra.Command{ GroupID: commoncmd.GroupIDSubsystems, Use: "schedule", Short: "scheduler commands", Aliases: []string{"sched"}, } - cmdNodeSSH = &cobra.Command{ - GroupID: commoncmd.GroupIDSubsystems, - Use: "ssh", - Short: "ssh commands", - } + cmdNodeSSH = commoncmd.NewCmdNodeSSH() cmdNodeConfig = &cobra.Command{ GroupID: commoncmd.GroupIDSubsystems, Use: "config", diff --git a/core/ox/pool.go b/core/ox/pool.go index 82ce12fc7..18baad7fe 100644 --- a/core/ox/pool.go +++ b/core/ox/pool.go @@ -1,20 +1,12 @@ package ox import ( - "github.com/spf13/cobra" + "github.com/opensvc/om3/v3/core/commoncmd" ) var ( - cmdPool = &cobra.Command{ - Use: "pool", - Short: "manage storage pools", - Long: ` A pool is a vol provider. Pools abstract the hardware and software specificities of the cluster infrastructure.`, - } - cmdPoolVolume = &cobra.Command{ - Use: "volume", - Short: "manage storage pool volumes", - Aliases: []string{"vol"}, - } + cmdPool = commoncmd.NewCmdPool() + cmdPoolVolume = commoncmd.NewCmdPoolVolume() ) func init() { diff --git a/core/oxcmd/object_config_get.go b/core/oxcmd/object_config_get.go index 471c20686..4701992c0 100644 --- a/core/oxcmd/object_config_get.go +++ b/core/oxcmd/object_config_get.go @@ -6,6 +6,7 @@ import ( "github.com/opensvc/om3/v3/core/client" "github.com/opensvc/om3/v3/core/commoncmd" + "github.com/opensvc/om3/v3/core/naming" "github.com/opensvc/om3/v3/core/objectselector" "github.com/opensvc/om3/v3/core/output" "github.com/opensvc/om3/v3/core/rawconfig" @@ -28,7 +29,12 @@ func (t *CmdObjectConfigGet) Run(kind string) error { return err } sel := objectselector.New(mergedSelector, objectselector.WithClient(c)) - paths, err := sel.MustExpand() + var paths naming.Paths + if t.IgnoreNotFound { + paths, err = sel.ExpandRelaxed() + } else { + paths, err = sel.MustExpand() + } if err != nil { return err } diff --git a/core/oxcmd/options.go b/core/oxcmd/options.go index 2ed9e15ac..6cce822b0 100644 --- a/core/oxcmd/options.go +++ b/core/oxcmd/options.go @@ -1,11 +1,10 @@ package oxcmd +import "github.com/opensvc/om3/v3/core/commoncmd" + type ( // OptsGlobal contains options accepted by all actions OptsGlobal struct { - Color string - Output string - ObjectSelector string - IgnoreNotFound bool + commoncmd.OptsGlobal } ) diff --git a/core/resourceid/resourceid.go b/core/resourceid/resourceid.go index 0305c433a..96a7a3f63 100644 --- a/core/resourceid/resourceid.go +++ b/core/resourceid/resourceid.go @@ -27,6 +27,7 @@ func Parse(s string) (*T, error) { case s == "": case s == "env": case s == "data": + case s == "labels": case s == "DEFAULT": case strings.HasPrefix(s, "subset#"): default: diff --git a/core/xconfig/validate.go b/core/xconfig/validate.go index efd4dd59c..89b182426 100644 --- a/core/xconfig/validate.go +++ b/core/xconfig/validate.go @@ -134,7 +134,7 @@ func (t T) NewAlertEval(k key.T, did driver.ID, comment string) Alert { func (t T) NewAlertDeprecated(k key.T, did driver.ID, release, replacedBy string) Alert { comment := fmt.Sprintf("since %s", release) if replacedBy != "" { - comment += fmt.Sprintf("replaced by %s", replacedBy) + comment += fmt.Sprintf(", replaced by %s", replacedBy) } return Alert{ Path: t.Path, diff --git a/daemon/daemon/main.go b/daemon/daemon/main.go index 7fd0beeb4..6643e1e1b 100644 --- a/daemon/daemon/main.go +++ b/daemon/daemon/main.go @@ -38,6 +38,7 @@ import ( "github.com/opensvc/om3/v3/daemon/hook" "github.com/opensvc/om3/v3/daemon/imon" "github.com/opensvc/om3/v3/daemon/istat" + "github.com/opensvc/om3/v3/daemon/mntmon" "github.com/opensvc/om3/v3/daemon/listener" "github.com/opensvc/om3/v3/daemon/msgbus" "github.com/opensvc/om3/v3/daemon/netmon" @@ -244,6 +245,7 @@ func (t *T) Start(ctx context.Context) error { listener.New(), nmon.NewManager(daemonenv.DrainChanDuration, qsMedium), netmon.NewManager(daemonenv.DrainChanDuration, qsSmall), + mntmon.NewManager(daemonenv.DrainChanDuration, qsSmall), hook.NewManager(daemonenv.DrainChanDuration, qsSmall), dns.NewManager(daemonenv.DrainChanDuration, qsMedium), pgmetrics.New(qsMedium), diff --git a/daemon/daemonapi/get_object_config.go b/daemon/daemonapi/get_object_config.go index 2206ec8ab..bf7d0c71c 100644 --- a/daemon/daemonapi/get_object_config.go +++ b/daemon/daemonapi/get_object_config.go @@ -1,6 +1,7 @@ package daemonapi import ( + "errors" "net/http" "github.com/labstack/echo/v4" @@ -8,6 +9,7 @@ import ( "github.com/opensvc/om3/v3/core/instance" "github.com/opensvc/om3/v3/core/naming" "github.com/opensvc/om3/v3/core/object" + "github.com/opensvc/om3/v3/core/xconfig" "github.com/opensvc/om3/v3/daemon/api" "github.com/opensvc/om3/v3/util/key" ) @@ -71,7 +73,9 @@ func (a *DaemonAPI) GetObjectConfig(ctx echo.Context, namespace string, kind nam } if isEvaluated { - if i, err := oc.EvalAs(k, evaluatedAs); err != nil { + if i, err := oc.EvalAs(k, evaluatedAs); errors.Is(err, xconfig.ErrNoKeyword) { + return JSONProblemf(ctx, http.StatusBadRequest, "EvalAs", "%s", err) + } else if err != nil { return JSONProblemf(ctx, http.StatusInternalServerError, "EvalAs", "%s", err) } else { item.Evaluated = &i diff --git a/daemon/daemonapi/get_object_selector.go b/daemon/daemonapi/get_object_selector.go index 4e837f378..1f0e66f0c 100644 --- a/daemon/daemonapi/get_object_selector.go +++ b/daemon/daemonapi/get_object_selector.go @@ -20,9 +20,9 @@ func (a *DaemonAPI) GetObjectPaths(ctx echo.Context, params api.GetObjectPathsPa objectselector.WithPaths(paths), objectselector.WithLocal(true), ) - matchedPaths, err := selection.Expand() + matchedPaths, err := selection.ExpandRelaxed() if err != nil { - log.Errorf("expand selection from param selector %s: %s", params.Path, err) + log.Warnf("expand selection from param selector %s: %s", params.Path, err) return JSONProblem(ctx, http.StatusInternalServerError, "Server error", "expand selection") } result := api.ObjectPaths{} diff --git a/daemon/daemonapi/lib_rbac.go b/daemon/daemonapi/lib_rbac.go index 1058fd812..a6d7991c2 100644 --- a/daemon/daemonapi/lib_rbac.go +++ b/daemon/daemonapi/lib_rbac.go @@ -262,7 +262,7 @@ func keyopRbac(grants rbac.Grants, op keyop.T) error { return fmt.Errorf("denied: %s: requires the root grant", op) } - case "env": + case "env", "labels": // allowed default: return fmt.Errorf("denied: %s: this driver group requires the root grant", op) diff --git a/daemon/icfg/main.go b/daemon/icfg/main.go index a08cb0215..71ac62da1 100644 --- a/daemon/icfg/main.go +++ b/daemon/icfg/main.go @@ -353,6 +353,7 @@ func (t *Manager) configFileCheck() error { cfg.Scope = scope cfg.UpdatedAt = mtime cfg.Priority = t.getPriority(cf) + cfg.Labels = cf.SectionMap("labels") if t.path.Kind == naming.KindVol { cfg.VolConfig = &instance.VolConfig{ Pool: cf.GetString(keyPool), @@ -471,7 +472,7 @@ func (t *Manager) getResources(cf *xconfig.T) instance.ResourceConfigs { m := make(instance.ResourceConfigs, 0) for _, section := range cf.SectionStrings() { switch section { - case "env", "DEFAULT": + case "env", "labels", "DEFAULT": continue } if resourceset.IsSubsetSection(section) { diff --git a/daemon/imon/main.go b/daemon/imon/main.go index a5c37ee44..06f66b18f 100644 --- a/daemon/imon/main.go +++ b/daemon/imon/main.go @@ -311,6 +311,11 @@ func (t *Manager) startSubscriptions(qs pubsub.QueueSizer) { sub.AddFilter(&msgbus.ObjectStatusUpdated{}, t.labelPath) sub.AddFilter(&msgbus.ProgressInstanceMonitor{}, t.labelPath) sub.AddFilter(&msgbus.SetInstanceMonitor{}, t.labelPath) + sub.AddFilter(&msgbus.NetIPAddrAdded{}, t.labelLocalhost) + sub.AddFilter(&msgbus.NetIPAddrDeleted{}, t.labelLocalhost) + sub.AddFilter(&msgbus.FSMounted{}, t.labelLocalhost) + sub.AddFilter(&msgbus.FSUmounted{}, t.labelLocalhost) + sub.AddFilter(&msgbus.FSRemounted{}, t.labelLocalhost) sub.Start() t.sub = sub } @@ -453,6 +458,16 @@ func (t *Manager) worker(initialNodes []string) { t.onNodeStatusUpdated(c) case *msgbus.NodeStatsUpdated: t.onNodeStatsUpdated(c) + case *msgbus.NetIPAddrAdded: + t.onNetIPAddrAdded(c) + case *msgbus.NetIPAddrDeleted: + t.onNetIPAddrDeleted(c) + case *msgbus.FSMounted: + t.onFSMounted(c) + case *msgbus.FSUmounted: + t.onFSUmounted(c) + case *msgbus.FSRemounted: + t.onFSRemounted(c) } case i := <-t.cmdC: if t.ctx.Err() != nil { diff --git a/daemon/imon/main_cmd.go b/daemon/imon/main_cmd.go index aad7b7b61..b4055a24c 100644 --- a/daemon/imon/main_cmd.go +++ b/daemon/imon/main_cmd.go @@ -5,6 +5,7 @@ import ( "crypto/md5" "errors" "fmt" + "net" "slices" "sort" "strings" @@ -1283,3 +1284,158 @@ func (t *Manager) savePendingOrchestration() { t.orchestrationPending = nil } } + +// extractIP extracts just the IP address from various formats (CIDR, with port, plain IP) +func extractIP(addr string) string { + if host, _, err := net.SplitHostPort(addr); err == nil { + return host + } + if ip, _, err := net.ParseCIDR(addr); err == nil { + return ip.String() + } + return addr +} + +// checkResourceForIPMatch checks if any resource has a matching IP address and triggers status refresh if found +func (t *Manager) checkResourceForIPMatch(ip string, linkName string, eventType string) { + // Get local instance status + instStatus, ok := t.instStatus[t.localhost] + if !ok { + t.log.Tracef("no local instance status found for IP address %s event", eventType) + return + } + + // Check if any resource has a matching IP address + for rid, rstat := range instStatus.Resources { + if ipaddr, ok := rstat.Info["ipaddr"]; ok { + // ipaddr can be a string or net.IP, convert to string for comparison + var ipaddrStr string + switch v := ipaddr.(type) { + case string: + ipaddrStr = v + case net.IP: + ipaddrStr = v.String() + default: + ipaddrStr = fmt.Sprintf("%v", v) + } + + if ipaddrStr == ip { + t.log.Infof("IP address %s on link %s, matching resource %s - triggering status refresh", ip, linkName, rid) + t.requestStatusRefresh(t.instConfig.Priority) + return + } + } + } + + t.log.Tracef("no resource found with IP address %s on link %s", ip, linkName) +} + +// onNetIPAddrAdded is called when a network IP address is added to a link. +// It checks if any instance resource has a matching IP address in its info, +// and if so, triggers a status refresh to update the resource status. +func (t *Manager) onNetIPAddrAdded(c *msgbus.NetIPAddrAdded) { + // Only handle events for the localhost + if c.Node != t.localhost { + return + } + if !t.canRefreshOnEvent() { + return + } + + ip := extractIP(c.Address) + t.checkResourceForIPMatch(ip, c.LinkName, "added") +} + +// onNetIPAddrDeleted is called when a network IP address is deleted from a link. +// It checks if any instance resource has a matching IP address in its info, +// and if so, triggers a status refresh to update the resource status. +func (t *Manager) onNetIPAddrDeleted(c *msgbus.NetIPAddrDeleted) { + // Only handle events for the localhost + if c.Node != t.localhost { + return + } + if !t.canRefreshOnEvent() { + return + } + + ip := extractIP(c.Address) + t.checkResourceForIPMatch(ip, c.LinkName, "deleted") +} + +// checkResourceForMountMatch checks if any resource has a matching mount point +func (t *Manager) checkResourceForMountMatch(mountPoint string, fsType string, eventType string) { + // Get local instance status + instStatus, ok := t.instStatus[t.localhost] + if !ok { + t.log.Tracef("no local instance status found for filesystem %s event", eventType) + return + } + + // Check if any resource has a matching mount point + for rid, rstat := range instStatus.Resources { + if mnt, ok := rstat.Info["mnt"]; ok { + // mnt can be a string, convert to string for comparison + var mntStr string + switch v := mnt.(type) { + case string: + mntStr = v + default: + mntStr = fmt.Sprintf("%v", v) + } + + if mntStr == mountPoint { + t.log.Infof("filesystem %s event on mount point %s, matching resource %s - triggering status refresh", eventType, mountPoint, rid) + t.requestStatusRefresh(t.instConfig.Priority) + return + } + } + } + + t.log.Tracef("no resource found with mount point %s", mountPoint) +} + +// onFSMounted is called when a filesystem is mounted. +// It checks if any instance resource has a matching mount point in its info, +// and if so, triggers a status refresh to update the resource status. +func (t *Manager) onFSMounted(c *msgbus.FSMounted) { + // Only handlgoinge events for the localhost + if c.Node != t.localhost { + return + } + if !t.canRefreshOnEvent() { + return + } + t.checkResourceForMountMatch(c.MountPoint, c.FSType, "mounted") +} + +// onFSUmounted is called when a filesystem is unmounted. +// It checks if any instance resource has a matching mount point in its info, +// and if so, triggers a status refresh to update the resource status. +func (t *Manager) onFSUmounted(c *msgbus.FSUmounted) { + // Only handle events for the localhost + if c.Node != t.localhost { + return + } + if !t.canRefreshOnEvent() { + return + } + t.checkResourceForMountMatch(c.MountPoint, c.FSType, "unmounted") +} + +// onFSRemounted is called when a filesystem is remounted. +// It checks if any instance resource has a matching mount point in its info, +// and if so, triggers a status refresh to update the resource status. +func (t *Manager) onFSRemounted(c *msgbus.FSRemounted) { + // Only handle events for the localhost + if c.Node != t.localhost { + return + } + if !t.canRefreshOnEvent() { + return + } + t.checkResourceForMountMatch(c.MountPoint, c.FSType, "remounted") +} + +func (t *Manager) canRefreshOnEvent() bool { + return !t.state.State.IsDoing() +} diff --git a/daemon/mntmon/main.go b/daemon/mntmon/main.go new file mode 100644 index 000000000..ce888e071 --- /dev/null +++ b/daemon/mntmon/main.go @@ -0,0 +1,267 @@ +// Package mntmon is responsible for monitoring filesystem mount/umount/remount events +// and publishing them as pubsub events. +// +// It watches /proc/self/mountinfo for changes via the kernel's POLLPRI/POLLERR wakeup mechanism. +package mntmon + +import ( + "bufio" + "context" + "os" + "strings" + "sync" + "time" + + "github.com/opensvc/om3/v3/daemon/msgbus" + "github.com/opensvc/om3/v3/util/hostname" + "github.com/opensvc/om3/v3/util/plog" + "github.com/opensvc/om3/v3/util/pubsub" + "golang.org/x/sys/unix" +) + +// mountEntry is a minimal parse of a /proc/*/mountinfo line, keyed by +// mount ID so remounts of the same path are still distinguishable. +type mountEntry struct { + id, mountPoint, fsType, source, options string +} + +func parseMountinfo(path string) (map[string]mountEntry, error) { + f, err := os.Open(path) + if err != nil { + return nil, err + } + defer f.Close() + + entries := make(map[string]mountEntry) + sc := bufio.NewScanner(f) + for sc.Scan() { + fields := strings.Fields(sc.Text()) + if len(fields) < 10 { + continue + } + // Fields: id parent major:minor root mountpoint opts ... - fstype source ... + sepIdx := -1 + for i, fld := range fields { + if fld == "-" { + sepIdx = i + break + } + } + if sepIdx == -1 || sepIdx+2 >= len(fields) { + continue + } + // fields[5] = per-mount options (e.g. "rw,relatime") + // fields[sepIdx+3], if present = super options (e.g. "rw,errors=remount-ro") + superOpts := "" + if sepIdx+3 < len(fields) { + superOpts = fields[sepIdx+3] + } + e := mountEntry{ + id: fields[0], + mountPoint: fields[4], + fsType: fields[sepIdx+1], + source: fields[sepIdx+2], + options: fields[5] + "|" + superOpts, + } + entries[e.id] = e + } + return entries, sc.Err() +} + +type ( + // Manager monitors mount/umount events and publishes them to the message bus + Manager struct { + drainDuration time.Duration + + ctx context.Context + cancel context.CancelFunc + log *plog.Logger + + publisher pubsub.Publisher + databus interface{} + sub *pubsub.Subscription + subQS pubsub.QueueSizer + + localhost string + labelLocalhost pubsub.Label + + wg sync.WaitGroup + } +) + +// NewManager creates a new mount monitor manager +func NewManager(drainDuration time.Duration, subQS pubsub.QueueSizer) *Manager { + localhost := hostname.Hostname() + return &Manager{ + drainDuration: drainDuration, + log: plog.NewDefaultLogger().Attr("pkg", "daemon/mntmon").WithPrefix("daemon: mntmon: "), + localhost: localhost, + labelLocalhost: pubsub.Label{"node", localhost}, + subQS: subQS, + } +} + +// Start launches the mntmon worker goroutine +func (t *Manager) Start(parent context.Context) error { + t.log.Infof("starting") + t.ctx, t.cancel = context.WithCancel(parent) + t.publisher = pubsub.PubFromContext(t.ctx) + + // Start pubsub subscriptions for audit and other control messages + t.startSubscriptions() + + t.wg.Add(1) + go func() { + defer t.wg.Done() + defer t.log.Infof("mount monitor done") + t.watchMounts() + }() + + t.log.Infof("started") + return nil +} + +// Stop stops the mntmon manager +func (t *Manager) Stop() error { + t.log.Infof("stopping") + defer t.log.Infof("stopped") + t.cancel() + if t.sub != nil { + if err := t.sub.Stop(); err != nil { + t.log.Warnf("subscription stop: %s", err) + } + } + t.wg.Wait() + return nil +} + +// startSubscriptions starts the pubsub subscriptions for control messages like AuditStart/AuditStop +func (t *Manager) startSubscriptions() { + sub := pubsub.SubFromContext(t.ctx, "daemon.mntmon", t.subQS) + + sub.AddFilter(&msgbus.AuditStart{}) + sub.AddFilter(&msgbus.AuditStop{}) + + sub.Start() + t.sub = sub + + t.wg.Add(1) + go func() { + defer t.wg.Done() + for { + select { + case <-t.ctx.Done(): + return + case ev := <-sub.C: + switch c := ev.(type) { + case *msgbus.AuditStart: + t.log.HandleAuditStart(c.Q, c.Subsystems, "mntmon") + case *msgbus.AuditStop: + t.log.HandleAuditStop(c.Q, c.Subsystems, "mntmon") + } + } + } + }() +} + +// watchMounts watches /proc/self/mountinfo for changes and emits msgbus events +func (t *Manager) watchMounts() { + t.log.Infof("starting mount monitor") + + mountinfoPath := "/proc/self/mountinfo" + + fd, err := unix.Open(mountinfoPath, unix.O_RDONLY, 0) + if err != nil { + t.log.Errorf("open %s: %s", mountinfoPath, err) + return + } + defer unix.Close(fd) + + prev, err := parseMountinfo(mountinfoPath) + if err != nil { + t.log.Errorf("parse mountinfo: %s", err) + return + } + + pfd := []unix.PollFd{{Fd: int32(fd), Events: unix.POLLERR | unix.POLLPRI}} + + // Use a finite poll timeout to allow checking context cancellation + const pollTimeout = 300 * time.Millisecond + + for { + select { + case <-t.ctx.Done(): + t.log.Infof("context done, stopping mount monitor") + return + default: + } + + // Poll with finite timeout + _, err := unix.Poll(pfd, int(pollTimeout.Milliseconds())) + if err != nil { + if err == unix.EINTR { + continue + } + t.log.Errorf("poll: %s", err) + return + } + + // Check context after poll returns (either due to event or timeout) + select { + case <-t.ctx.Done(): + t.log.Infof("context done, stopping mount monitor") + return + default: + } + + cur, err := parseMountinfo(mountinfoPath) + if err != nil { + t.log.Errorf("parse mountinfo: %s", err) + continue + } + + // Publish mount and remount events + for id, e := range cur { + old, existed := prev[id] + switch { + case !existed: + msg := &msgbus.FSMounted{ + Node: t.localhost, + MountPoint: e.mountPoint, + FSType: e.fsType, + Source: e.source, + Options: e.options, + } + t.log.Infof("filesystem mounted: %s (type=%s, source=%s)", e.mountPoint, e.fsType, e.source) + t.publisher.Pub(msg, t.labelLocalhost) + case old.options != e.options: + msg := &msgbus.FSRemounted{ + Node: t.localhost, + MountPoint: e.mountPoint, + FSType: e.fsType, + Source: e.source, + Options: e.options, + } + t.log.Infof("filesystem remounted: %s (type=%s, source=%s)", e.mountPoint, e.fsType, e.source) + t.publisher.Pub(msg, t.labelLocalhost) + } + } + + // Publish umount events + for id, e := range prev { + if _, ok := cur[id]; !ok { + msg := &msgbus.FSUmounted{ + Node: t.localhost, + MountPoint: e.mountPoint, + FSType: e.fsType, + Source: e.source, + Options: e.options, + } + t.log.Infof("filesystem unmounted: %s (type=%s, source=%s)", e.mountPoint, e.fsType, e.source) + t.publisher.Pub(msg, t.labelLocalhost) + } + } + + prev = cur + } +} diff --git a/daemon/msgbus/messages.go b/daemon/msgbus/messages.go index 402529daa..d6a9bce2a 100644 --- a/daemon/msgbus/messages.go +++ b/daemon/msgbus/messages.go @@ -273,6 +273,10 @@ var ( "NetLinkUp": func() any { return &NetLinkUp{} }, "NetIPAddrAdded": func() any { return &NetIPAddrAdded{} }, "NetIPAddrDeleted": func() any { return &NetIPAddrDeleted{} }, + + "FSMounted": func() any { return &FSMounted{} }, + "FSUmounted": func() any { return &FSUmounted{} }, + "FSRemounted": func() any { return &FSRemounted{} }, } ) @@ -1013,6 +1017,36 @@ type ( LinkName string `json:"link_name" yaml:"link_name"` Address string `json:"address" yaml:"address"` } + + // FSMounted is published when a filesystem is mounted + FSMounted struct { + pubsub.Msg `yaml:",inline"` + Node string `json:"node" yaml:"node"` + MountPoint string `json:"mount_point" yaml:"mount_point"` + FSType string `json:"fs_type" yaml:"fs_type"` + Source string `json:"source" yaml:"source"` + Options string `json:"options" yaml:"options"` + } + + // FSUmounted is published when a filesystem is unmounted + FSUmounted struct { + pubsub.Msg `yaml:",inline"` + Node string `json:"node" yaml:"node"` + MountPoint string `json:"mount_point" yaml:"mount_point"` + FSType string `json:"fs_type" yaml:"fs_type"` + Source string `json:"source" yaml:"source"` + Options string `json:"options" yaml:"options"` + } + + // FSRemounted is published when a filesystem is remounted + FSRemounted struct { + pubsub.Msg `yaml:",inline"` + Node string `json:"node" yaml:"node"` + MountPoint string `json:"mount_point" yaml:"mount_point"` + FSType string `json:"fs_type" yaml:"fs_type"` + Source string `json:"source" yaml:"source"` + Options string `json:"options" yaml:"options"` + } ) func DropPendingMsg(c <-chan any, duration time.Duration) { @@ -1564,6 +1598,30 @@ func (e *NetIPAddrDeleted) Key() string { return fmt.Sprintf("NetIPAddrDeleted,node=%s,link_name=%s,address=%s", e.Node, e.LinkName, e.Address) } +func (e *FSMounted) Kind() string { + return "FSMounted" +} + +func (e *FSMounted) Key() string { + return fmt.Sprintf("FSMounted,node=%s,mount_point=%s", e.Node, e.MountPoint) +} + +func (e *FSUmounted) Kind() string { + return "FSUmounted" +} + +func (e *FSUmounted) Key() string { + return fmt.Sprintf("FSUmounted,node=%s,mount_point=%s", e.Node, e.MountPoint) +} + +func (e *FSRemounted) Kind() string { + return "FSRemounted" +} + +func (e *FSRemounted) Key() string { + return fmt.Sprintf("FSRemounted,node=%s,mount_point=%s", e.Node, e.MountPoint) +} + func NewSetInstanceMonitorWithErr(ctx context.Context, p naming.Path, nodename string, value instance.MonitorUpdate) (*SetInstanceMonitor, errcontext.ErrReceiver) { err := errcontext.New(ctx) return &SetInstanceMonitor{Path: p, Node: nodename, Value: value, Err: err}, err diff --git a/drivers/networkroutedbridge/main.go b/drivers/networkroutedbridge/main.go index 4761fd7fc..c9ba67801 100644 --- a/drivers/networkroutedbridge/main.go +++ b/drivers/networkroutedbridge/main.go @@ -4,8 +4,8 @@ package networkroutedbridge import ( "fmt" - "math" "math/big" + "math/bits" "net" "strings" @@ -123,6 +123,23 @@ func (t *T) bridgeIP() (net.IP, error) { return ip, nil } +func ipsToMaskOnes(requestedIPs uint64, totalBits int) (int, error) { + if requestedIPs == 0 { + return totalBits, nil + } + + // Find the next highest power of 2. + // Example: 250 IPs -> 250-1 = 249. Binary length of 249 is 8 bits. 2^8 = 256. + hostBits := bits.Len64(requestedIPs - 1) + + if hostBits > totalBits { + return 0, fmt.Errorf("requested allocation size of %d IPs exceeds maximum %d-bit address space", requestedIPs, totalBits) + } + + ones := totalBits - hostBits + return ones, nil +} + func (t *T) allocateSubnets() error { subnetMap, err := t.subnets() if err != nil { @@ -135,21 +152,22 @@ func (t *T) allocateSubnets() error { } } + ip, netwk, err := net.ParseCIDR(t.Network()) + if err != nil { + return err + } + ones, bits := netwk.Mask.Size() + maskPerNode := t.GetInt("mask_per_node") if maskPerNode <= 0 { ipsPerNode := t.GetInt("ips_per_node") if ipsPerNode <= 0 { return fmt.Errorf("either mask_per_node or ips_per_node must be set to a value greater than 0") } - if ipsPerNode&(ipsPerNode-1) == 1 { - return fmt.Errorf("ips_per_node must be a power of 2") + maskPerNode, err = ipsToMaskOnes(uint64(ipsPerNode), bits) + if err != nil { + return err } - maskPerNode = int(math.Log2(float64(ipsPerNode))) - } - - ip, netwk, err := net.ParseCIDR(t.Network()) - if err != nil { - return err } nodes, err := t.Nodes() @@ -161,11 +179,10 @@ func (t *T) allocateSubnets() error { return err } - _, bits := netwk.Mask.Size() m := make(map[string]string) for i, nodename := range nodes { - nodeIp, subnet, err := computeSubnet(ip, int64(i), maskPerNode, bits, maskPerNode) + nodeIp, subnet, err := computeSubnet(ip, int64(i), maskPerNode, ones, bits) if err != nil { return err } @@ -181,24 +198,35 @@ func (t *T) allocateSubnets() error { return nil } -func computeSubnet(baseIP net.IP, nodeIndex int64, maskPerNode int, bits, subnetOnes int) (net.IP, string, error) { +func computeSubnet(baseIP net.IP, nodeIndex int64, maskPerNode int, ones, bits int) (net.IP, string, error) { ip16 := baseIP.To16() if ip16 == nil { return nil, "", fmt.Errorf("invalid base ip %s", baseIP) } - ipsPerNode := new(big.Int).Lsh(big.NewInt(1), uint(maskPerNode)) + if maskPerNode > bits || maskPerNode < 0 { + return nil, "", fmt.Errorf("maskPerNode /%d out of bounds for %d-bit space", maskPerNode, bits) + } + hostBits := bits - maskPerNode + ipsPerNode := new(big.Int).Lsh(big.NewInt(1), uint(hostBits)) + // Compute the offset block: nodeIndex * ipsPerNode baseInt := new(big.Int).SetBytes(ip16) idxBig := big.NewInt(nodeIndex) offset := new(big.Int).Mul(idxBig, ipsPerNode) + // Add the offset to the base address nodeInt := new(big.Int).Add(baseInt, offset) - if nodeInt.BitLen() > 128 { - return nil, "", fmt.Errorf("computed ip exceeds maximum size") + parentHostBits := bits - ones + parentSize := new(big.Int).Lsh(big.NewInt(1), uint(parentHostBits)) + parentCeiling := new(big.Int).Add(baseInt, parentSize) + + if nodeInt.Cmp(parentCeiling) >= 0 { + return nil, "", fmt.Errorf("computed subnet index %d overflows the parent network boundary", nodeIndex) } + // Unpack bytes back to net.IP nodeBytes := nodeInt.FillBytes(make([]byte, 16)) nodeIP := net.IP(nodeBytes) @@ -206,21 +234,44 @@ func computeSubnet(baseIP net.IP, nodeIndex int64, maskPerNode int, bits, subnet nodeIP = nodeIP.To4() } - prefix := bits - subnetOnes - subnet := fmt.Sprintf("%s/%d", nodeIP.String(), prefix) + subnet := fmt.Sprintf("%s/%d", nodeIP.String(), maskPerNode) + return nodeIP, subnet, nil } func (t *T) checkMaxIpsPerNode(network *net.IPNet, maskPerNode int, nodes []string) error { - ipsPerNode := new(big.Int).Lsh(big.NewInt(1), uint(maskPerNode)) - one := big.NewInt(1) + if network == nil || network.Mask == nil { + return fmt.Errorf("invalid network context provided") + } + + numNodes := int64(len(nodes)) + if numNodes == 0 { + // Nothing to distribute + return nil + } + ones, bits := network.Mask.Size() + + if maskPerNode < ones || maskPerNode > bits { + return fmt.Errorf("requested node mask /%d is out of bounds for parent network %s", maskPerNode, network) + } + + one := big.NewInt(1) + maxIPs := new(big.Int).Lsh(one, uint(bits-ones)) - maxIPsPerNodes := new(big.Int).Div(maxIPs, big.NewInt(int64(len(nodes)))) - minSubnetOnes := maxIPsPerNodes.BitLen() - 1 - maxIPsPerNodes = new(big.Int).Lsh(one, uint(minSubnetOnes)) - if ipsPerNode.Cmp(maxIPsPerNodes) > 0 { - return fmt.Errorf("ips_per_node=%s must be <=%s (%s has %s ips to distribute to %d nodes)", ipsPerNode.String(), maxIPsPerNodes.String(), network, maxIPs.String(), len(nodes)) + requestedIPsPerNode := new(big.Int).Lsh(one, uint(bits-maskPerNode)) + totalRequiredIPs := new(big.Int).Mul(requestedIPsPerNode, big.NewInt(numNodes)) + if totalRequiredIPs.Cmp(maxIPs) > 0 { + maxIPsPerNodePossible := new(big.Int).Div(maxIPs, big.NewInt(numNodes)) + return fmt.Errorf("ips_per_node=%s (/%d) is too large. Total required across %d nodes is %s, but %s only provides %s total IPs (max possible per node is ~%s)", + requestedIPsPerNode.String(), + maskPerNode, + numNodes, + totalRequiredIPs.String(), + network.String(), + maxIPs.String(), + maxIPsPerNodePossible.String(), + ) } return nil } diff --git a/drivers/resfshost/main.go b/drivers/resfshost/main.go index 58b21fe65..b09daac33 100644 --- a/drivers/resfshost/main.go +++ b/drivers/resfshost/main.go @@ -199,6 +199,13 @@ func (t *T) Info(ctx context.Context) (resource.InfoKeys, error) { return m, nil } +// StatusInfo implements resource.StatusInfoer +func (t *T) StatusInfo(ctx context.Context) map[string]interface{} { + data := make(map[string]interface{}) + data["mnt"] = t.mountPoint() + return data +} + func (t *T) testFile() string { return filepath.Join(t.mountPoint(), ".opensvc") } diff --git a/drivers/resfszfs/main.go b/drivers/resfszfs/main.go index bf6695e2e..254f860d7 100644 --- a/drivers/resfszfs/main.go +++ b/drivers/resfszfs/main.go @@ -139,6 +139,13 @@ func (t *T) Info(ctx context.Context) (resource.InfoKeys, error) { return m, nil } +// StatusInfo implements resource.StatusInfoer +func (t *T) StatusInfo(ctx context.Context) map[string]interface{} { + data := make(map[string]interface{}) + data["mnt"] = t.mountPoint() + return data +} + func (t *T) testFile() string { return filepath.Join(t.mountPoint(), ".opensvc") } diff --git a/util/compobj/svcconf.go b/util/compobj/svcconf.go index aa5193e89..945b628f6 100644 --- a/util/compobj/svcconf.go +++ b/util/compobj/svcconf.go @@ -11,6 +11,8 @@ import ( "github.com/opensvc/om3/v3/core/naming" "github.com/opensvc/om3/v3/core/object" "github.com/opensvc/om3/v3/util/key" + + _ "github.com/opensvc/om3/v3/core/driverdb" ) type ( @@ -243,7 +245,8 @@ func (t CompSvcconfs) checkValue(resourceName string, keyName string, value stri if op == "unset" { return !o.Config().HasKey(key.New(resourceName, keyName)) } - return o.Config().HasKeyMatchingOp(*keyop.Parse(resourceName + "." + keyName + op + value)) + kop := keyop.Parse(resourceName + "." + keyName + op + value) + return o.Config().HasKeyMatchingOp(*kop) } func (t CompSvcconfs) checkSection(resourceName string, rule CompSvcconf) bool { diff --git a/util/key/key.go b/util/key/key.go index ccf3447e7..ace45c8a6 100644 --- a/util/key/key.go +++ b/util/key/key.go @@ -64,7 +64,7 @@ func ParseWithDefaultSection(s, defaultSection string) (T, error) { return T{defaultSection, s}, nil case 2: switch l[0] { - case "env", "data": + case "env", "data", "labels": // "data.c.d" parses as {"data", "c.d"} return T{l[0], l[1]}, nil default: