diff --git a/cli/pkg/serviceLib/flags/examples.go b/cli/pkg/serviceLib/flags/examples.go
new file mode 100644
index 0000000..eb5993e
--- /dev/null
+++ b/cli/pkg/serviceLib/flags/examples.go
@@ -0,0 +1,326 @@
+// Copyright (c) 2024 Seagate Technology LLC and/or its Affiliates
+package flags
+
+import "fmt"
+
+// Family of getter functions to allow retrieval of consistent strings, for each option, when building the cobra.Command Example field string across multiple commands.
+
+func GetOptionExampleLhGroupServiceTcp() string {
+ return fmt.Sprintf("%s %s %s %s",
+ GetOptionExampleLhServiceIp(),
+ GetOptionExampleLhServicePort(),
+ GetOptionExampleLhServiceInsecure(),
+ GetOptionExampleLhServiceProtocol())
+}
+
+func GetOptionExampleLhServiceIp() string {
+ return fmt.Sprintf("--%s %s", SERVICE_NET_IP, SERVICE_NET_IP_DFLT)
+}
+
+func GetOptionExampleLhServicePort() string {
+ return fmt.Sprintf("--%s %d", SERVICE_NET_PORT, SERVICE_NET_PORT_DFLT)
+}
+
+func GetOptionExampleLhServiceInsecure() string {
+ return fmt.Sprintf("--%s", SERVICE_INSECURE)
+}
+
+func GetOptionExampleLhServiceProtocol() string {
+ return fmt.Sprintf("--%s %s", SERVICE_PROTOCOL, SERVICE_PROTOCOL_DFLT)
+}
+
+func GetOptionExampleLhApplianceId() string {
+ return fmt.Sprintf("--%s applianceId", APPLIANCE_ID)
+}
+
+func GetOptionExampleLhBladeId() string {
+ return fmt.Sprintf("--%s bladeId", BLADE_ID)
+}
+
+func GetOptionExampleLhHostId() string {
+ return fmt.Sprintf("--%s hostId", HOST_ID)
+}
+
+func GetOptionExampleLhNewId() string {
+ return fmt.Sprintf("--%s newId", NEW_ID)
+}
+
+func GetOptionExampleLhApplianceUsername() string {
+ return fmt.Sprintf("--%s %s", APPLIANCE_USERNAME, APPLIANCE_USERNAME_DFLT)
+}
+
+func GetOptionExampleLhAppliancePassword() string {
+ return fmt.Sprintf("--%s %s", APPLIANCE_PASSWORD, APPLIANCE_PASSWORD_DFLT)
+}
+
+func GetOptionExampleLhGroupApplianceTcp() string {
+ return fmt.Sprintf("%s %s %s %s",
+ GetOptionExampleLhApplianceIp(),
+ GetOptionExampleLhAppliancePort(),
+ GetOptionExampleLhApplianceInsecure(),
+ GetOptionExampleLhApplianceProtocol())
+}
+
+func GetOptionExampleLhApplianceIp() string {
+ return fmt.Sprintf("--%s %s", APPLIANCE_NET_IP, APPLIANCE_NET_IP_DFLT)
+}
+
+func GetOptionExampleLhAppliancePort() string {
+ return fmt.Sprintf("--%s %d", APPLIANCE_NET_PORT, APPLIANCE_NET_PORT_DFLT)
+}
+
+func GetOptionExampleLhApplianceInsecure() string {
+ return fmt.Sprintf("--%s", APPLIANCE_INSECURE)
+}
+
+func GetOptionExampleLhApplianceProtocol() string {
+ return fmt.Sprintf("--%s %s", APPLIANCE_PROTOCOL, APPLIANCE_PROTOCOL_DFLT)
+}
+
+func GetOptionExampleLhBladeUsername() string {
+ return fmt.Sprintf("--%s %s", BLADE_USERNAME, BLADE_USERNAME_DFLT)
+}
+
+func GetOptionExampleLhBladePassword() string {
+ return fmt.Sprintf("--%s %s", BLADE_PASSWORD, BLADE_PASSWORD_DFLT)
+}
+
+func GetOptionExampleLhGroupBladeTcp() string {
+ return fmt.Sprintf("%s %s %s %s",
+ GetOptionExampleLhBladeIp(),
+ GetOptionExampleLhBladePort(),
+ GetOptionExampleLhBladeInsecure(),
+ GetOptionExampleLhBladeProtocol())
+}
+
+func GetOptionExampleLhBladeIp() string {
+ return fmt.Sprintf("--%s %s", BLADE_NET_IP, BLADE_NET_IP_DFLT)
+}
+
+func GetOptionExampleLhBladePort() string {
+ return fmt.Sprintf("--%s %d", BLADE_NET_PORT, BLADE_NET_PORT_DFLT)
+}
+
+func GetOptionExampleLhBladeInsecure() string {
+ return fmt.Sprintf("--%s", BLADE_INSECURE)
+}
+
+func GetOptionExampleLhBladeProtocol() string {
+ return fmt.Sprintf("--%s %s", BLADE_PROTOCOL, BLADE_PROTOCOL_DFLT)
+}
+
+func GetOptionExampleLhHostUsername() string {
+ return fmt.Sprintf("--%s %s", HOST_USERNAME, HOST_USERNAME_DFLT)
+}
+
+func GetOptionExampleLhHostPassword() string {
+ return fmt.Sprintf("--%s %s", HOST_PASSWORD, HOST_PASSWORD_DFLT)
+}
+
+func GetOptionExampleLhGroupHostTcp() string {
+ return fmt.Sprintf("%s %s %s %s",
+ GetOptionExampleLhHostIp(),
+ GetOptionExampleLhHostPort(),
+ GetOptionExampleLhHostInsecure(),
+ GetOptionExampleLhHostProtocol())
+}
+
+func GetOptionExampleLhHostIp() string {
+ return fmt.Sprintf("--%s %s", HOST_NET_IP, HOST_NET_IP_DFLT)
+}
+
+func GetOptionExampleLhHostPort() string {
+ return fmt.Sprintf("--%s %d", HOST_NET_PORT, HOST_NET_PORT_DFLT)
+}
+
+func GetOptionExampleLhHostInsecure() string {
+ return fmt.Sprintf("--%s", HOST_INSECURE)
+}
+
+func GetOptionExampleLhHostProtocol() string {
+ return fmt.Sprintf("--%s %s", HOST_PROTOCOL, HOST_PROTOCOL_DFLT)
+}
+
+func GetOptionExampleLhMemoryId() string {
+ return fmt.Sprintf("--%s memoryId", MEMORY_ID)
+}
+
+func GetOptionExampleLhMemoryQos() string {
+ return fmt.Sprintf("--%s %d", MEMORY_QOS, MEMORY_QOS_DFLT)
+}
+
+func GetOptionExampleLhMemoryDeviceId() string {
+ return fmt.Sprintf("--%s memoryDeviceId", MEMORY_DEVICE_ID)
+}
+
+func GetOptionExampleLhPortId() string {
+ return fmt.Sprintf("--%s portId", PORT_ID)
+}
+
+func GetOptionExampleLhResourceId() string {
+ return fmt.Sprintf("--%s resourceId", RESOURCE_ID)
+}
+
+func GetOptionExampleLhResourceSize() string {
+ return fmt.Sprintf("--%s %s", RESOURCE_SIZE, SIZE_DFLT)
+}
+
+func GetOptionExampleShGroupServiceTcp() string {
+ return fmt.Sprintf("%s %s %s %s",
+ GetOptionExampleShServiceIp(),
+ GetOptionExampleShServicePort(),
+ GetOptionExampleShServiceInsecure(),
+ GetOptionExampleShServiceProtocol())
+}
+
+func GetOptionExampleShServiceIp() string {
+ return fmt.Sprintf("-%s %s", SERVICE_NET_IP_SH, SERVICE_NET_IP_DFLT)
+}
+
+func GetOptionExampleShServicePort() string {
+ return fmt.Sprintf("-%s %d", SERVICE_NET_PORT_SH, SERVICE_NET_PORT_DFLT)
+}
+
+func GetOptionExampleShServiceInsecure() string {
+ return fmt.Sprintf("-%s", SERVICE_INSECURE_SH)
+}
+
+func GetOptionExampleShServiceProtocol() string {
+ return fmt.Sprintf("-%s %s", SERVICE_PROTOCOL_SH, SERVICE_PROTOCOL_DFLT)
+}
+
+func GetOptionExampleShApplianceId() string {
+ return fmt.Sprintf("-%s applianceId", APPLIANCE_ID_SH)
+}
+
+func GetOptionExampleShBladeId() string {
+ return fmt.Sprintf("-%s bladeId", BLADE_ID_SH)
+}
+
+func GetOptionExampleShHostId() string {
+ return fmt.Sprintf("-%s hostId", HOST_ID_SH)
+}
+
+func GetOptionExampleShNewId() string {
+ return fmt.Sprintf("-%s newId", NEW_ID_SH)
+}
+
+func GetOptionExampleShApplianceUsername() string {
+ return fmt.Sprintf("-%s %s", APPLIANCE_USERNAME_SH, APPLIANCE_USERNAME_DFLT)
+}
+
+func GetOptionExampleShAppliancePassword() string {
+ return fmt.Sprintf("-%s %s", APPLIANCE_PASSWORD_SH, APPLIANCE_PASSWORD_DFLT)
+}
+
+func GetOptionExampleShGroupApplianceTcp() string {
+ return fmt.Sprintf("%s %s %s %s",
+ GetOptionExampleShApplianceIp(),
+ GetOptionExampleShAppliancePort(),
+ GetOptionExampleShApplianceInsecure(),
+ GetOptionExampleShApplianceProtocol())
+}
+
+func GetOptionExampleShApplianceIp() string {
+ return fmt.Sprintf("-%s %s", APPLIANCE_NET_IP_SH, APPLIANCE_NET_IP_DFLT)
+}
+
+func GetOptionExampleShAppliancePort() string {
+ return fmt.Sprintf("-%s %d", APPLIANCE_NET_PORT_SH, APPLIANCE_NET_PORT_DFLT)
+}
+
+func GetOptionExampleShApplianceInsecure() string {
+ return fmt.Sprintf("-%s", APPLIANCE_INSECURE_SH)
+}
+
+func GetOptionExampleShApplianceProtocol() string {
+ return fmt.Sprintf("-%s %s", APPLIANCE_PROTOCOL_SH, APPLIANCE_PROTOCOL_DFLT)
+}
+
+func GetOptionExampleShBladeUsername() string {
+ return fmt.Sprintf("-%s %s", BLADE_USERNAME_SH, BLADE_USERNAME_DFLT)
+}
+
+func GetOptionExampleShBladePassword() string {
+ return fmt.Sprintf("-%s %s", BLADE_PASSWORD_SH, BLADE_PASSWORD_DFLT)
+}
+
+func GetOptionExampleShGroupBladeTcp() string {
+ return fmt.Sprintf("%s %s %s %s",
+ GetOptionExampleShBladeIp(),
+ GetOptionExampleShBladePort(),
+ GetOptionExampleShBladeInsecure(),
+ GetOptionExampleShBladeProtocol())
+}
+
+func GetOptionExampleShBladeIp() string {
+ return fmt.Sprintf("-%s %s", BLADE_NET_IP_SH, BLADE_NET_IP_DFLT)
+}
+
+func GetOptionExampleShBladePort() string {
+ return fmt.Sprintf("-%s %d", BLADE_NET_PORT_SH, BLADE_NET_PORT_DFLT)
+}
+
+func GetOptionExampleShBladeInsecure() string {
+ return fmt.Sprintf("-%s", BLADE_INSECURE_SH)
+}
+
+func GetOptionExampleShBladeProtocol() string {
+ return fmt.Sprintf("-%s %s", BLADE_PROTOCOL_SH, BLADE_PROTOCOL_DFLT)
+}
+
+func GetOptionExampleShHostUsername() string {
+ return fmt.Sprintf("-%s %s", HOST_USERNAME_SH, HOST_USERNAME_DFLT)
+}
+
+func GetOptionExampleShHostPassword() string {
+ return fmt.Sprintf("-%s %s", HOST_PASSWORD_SH, HOST_PASSWORD_DFLT)
+}
+
+func GetOptionExampleShGroupHostTcp() string {
+ return fmt.Sprintf("%s %s %s %s",
+ GetOptionExampleShHostIp(),
+ GetOptionExampleShHostPort(),
+ GetOptionExampleShHostInsecure(),
+ GetOptionExampleShHostProtocol())
+}
+
+func GetOptionExampleShHostIp() string {
+ return fmt.Sprintf("-%s %s", HOST_NET_IP_SH, HOST_NET_IP_DFLT)
+}
+
+func GetOptionExampleShHostPort() string {
+ return fmt.Sprintf("-%s %d", HOST_NET_PORT_SH, HOST_NET_PORT_DFLT)
+}
+
+func GetOptionExampleShHostInsecure() string {
+ return fmt.Sprintf("-%s", HOST_INSECURE_SH)
+}
+
+func GetOptionExampleShHostProtocol() string {
+ return fmt.Sprintf("-%s %s", HOST_PROTOCOL_SH, HOST_PROTOCOL_DFLT)
+}
+
+func GetOptionExampleShMemoryId() string {
+ return fmt.Sprintf("-%s memoryId", MEMORY_ID_SH)
+}
+
+func GetOptionExampleShMemoryQos() string {
+ return fmt.Sprintf("-%s %d", MEMORY_QOS_SH, MEMORY_QOS_DFLT)
+}
+
+func GetOptionExampleShMemoryDeviceId() string {
+ return fmt.Sprintf("-%s memoryDeviceId", MEMORY_DEVICE_ID_SH)
+}
+
+func GetOptionExampleShPortId() string {
+ return fmt.Sprintf("-%s portId", PORT_ID_SH)
+}
+
+func GetOptionExampleShResourceId() string {
+ return fmt.Sprintf("-%s resourceId", RESOURCE_ID_SH)
+}
+
+func GetOptionExampleShResourceSize() string {
+ return fmt.Sprintf("-%s %s", RESOURCE_SIZE_SH, SIZE_DFLT)
+}
diff --git a/cli/pkg/serviceLib/flags/flags.go b/cli/pkg/serviceLib/flags/flags.go
index de259d3..d1576b3 100644
--- a/cli/pkg/serviceLib/flags/flags.go
+++ b/cli/pkg/serviceLib/flags/flags.go
@@ -4,8 +4,7 @@ package flags
// CLI flag component descriptor
const (
- SERVICE string = "serv"
- DEVICE string = "dev" //generic "device" for appliance OR host - future deprecation
+ SERVICE string = "service"
APPLIANCE string = "appliance"
BLADE string = "blade"
HOST string = "host"
@@ -13,6 +12,13 @@ const (
MEMORY_DEVICE string = "memory-device"
PORT string = "port"
RESOURCE string = "resource"
+
+ APPLIANCES string = "appliances"
+ BLADES string = "blades"
+ HOSTS string = "hosts"
+ MEMORY_DEVICES string = "memory-devices"
+ PORTS string = "ports"
+ RESOURCES string = "resources"
)
// CLI flag detail descriptor
@@ -20,7 +26,7 @@ const (
ID string = "id"
USERNAME string = "username"
PASSWORD string = "password"
- NET_IP string = "ip"
+ NET_IP string = "net-ip"
NET_PORT string = "net-port"
INSECURE string = "insecure"
PROTOCOL string = "protocol"
@@ -40,9 +46,9 @@ const (
SERVICE_NET_PORT string = SERVICE + "-" + NET_PORT
SERVICE_NET_PORT_SH string = "p"
SERVICE_INSECURE string = SERVICE + "-" + INSECURE
- SERVICE_INSECURE_SH string = "" //"s"
+ SERVICE_INSECURE_SH string = "s"
SERVICE_PROTOCOL string = SERVICE + "-" + PROTOCOL
- SERVICE_PROTOCOL_SH string = "" //"t"
+ SERVICE_PROTOCOL_SH string = "t"
APPLIANCE_ID string = APPLIANCE + "-" + ID
APPLIANCE_ID_SH string = "L"
@@ -53,18 +59,51 @@ const (
NEW_ID string = NEW + "-" + ID
NEW_ID_SH string = "N"
- DEVICE_USERNAME string = DEVICE + "-" + USERNAME
- DEVICE_USERNAME_SH string = "R"
- DEVICE_PASSWORD string = DEVICE + "-" + PASSWORD
- DEVICE_PASSWORD_SH string = "W"
- DEVICE_NET_IP string = DEVICE + "-" + NET_IP
- DEVICE_NET_IP_SH string = "A"
- DEVICE_NET_PORT string = DEVICE + "-" + NET_PORT
- DEVICE_NET_PORT_SH string = "P"
- DEVICE_INSECURE string = DEVICE + "-" + INSECURE
- DEVICE_INSECURE_SH string = "S"
- DEVICE_PROTOCOL string = DEVICE + "-" + PROTOCOL
- DEVICE_PROTOCOL_SH string = "T"
+ COMMON_USERNAME_SH string = "R"
+ COMMON_PASSWORD_SH string = "W"
+ COMMON_NET_IP_SH string = "A"
+ COMMON_NET_PORT_SH string = "P"
+ COMMON_INSECURE_SH string = "S"
+ COMMON_PROTOCOL_SH string = "T"
+
+ APPLIANCE_USERNAME string = APPLIANCE + "-" + USERNAME
+ APPLIANCE_USERNAME_SH string = COMMON_USERNAME_SH
+ APPLIANCE_PASSWORD string = APPLIANCE + "-" + PASSWORD
+ APPLIANCE_PASSWORD_SH string = COMMON_PASSWORD_SH
+ APPLIANCE_NET_IP string = APPLIANCE + "-" + NET_IP
+ APPLIANCE_NET_IP_SH string = COMMON_NET_IP_SH
+ APPLIANCE_NET_PORT string = APPLIANCE + "-" + NET_PORT
+ APPLIANCE_NET_PORT_SH string = COMMON_NET_PORT_SH
+ APPLIANCE_INSECURE string = APPLIANCE + "-" + INSECURE
+ APPLIANCE_INSECURE_SH string = COMMON_INSECURE_SH
+ APPLIANCE_PROTOCOL string = APPLIANCE + "-" + PROTOCOL
+ APPLIANCE_PROTOCOL_SH string = COMMON_PROTOCOL_SH
+
+ BLADE_USERNAME string = BLADE + "-" + USERNAME
+ BLADE_USERNAME_SH string = COMMON_USERNAME_SH
+ BLADE_PASSWORD string = BLADE + "-" + PASSWORD
+ BLADE_PASSWORD_SH string = COMMON_PASSWORD_SH
+ BLADE_NET_IP string = BLADE + "-" + NET_IP
+ BLADE_NET_IP_SH string = COMMON_NET_IP_SH
+ BLADE_NET_PORT string = BLADE + "-" + NET_PORT
+ BLADE_NET_PORT_SH string = COMMON_NET_PORT_SH
+ BLADE_INSECURE string = BLADE + "-" + INSECURE
+ BLADE_INSECURE_SH string = COMMON_INSECURE_SH
+ BLADE_PROTOCOL string = BLADE + "-" + PROTOCOL
+ BLADE_PROTOCOL_SH string = COMMON_PROTOCOL_SH
+
+ HOST_USERNAME string = HOST + "-" + USERNAME
+ HOST_USERNAME_SH string = COMMON_USERNAME_SH
+ HOST_PASSWORD string = HOST + "-" + PASSWORD
+ HOST_PASSWORD_SH string = COMMON_PASSWORD_SH
+ HOST_NET_IP string = HOST + "-" + NET_IP
+ HOST_NET_IP_SH string = COMMON_NET_IP_SH
+ HOST_NET_PORT string = HOST + "-" + NET_PORT
+ HOST_NET_PORT_SH string = COMMON_NET_PORT_SH
+ HOST_INSECURE string = HOST + "-" + INSECURE
+ HOST_INSECURE_SH string = COMMON_INSECURE_SH
+ HOST_PROTOCOL string = HOST + "-" + PROTOCOL
+ HOST_PROTOCOL_SH string = COMMON_PROTOCOL_SH
MEMORY_ID string = MEMORY + "-" + ID
MEMORY_ID_SH string = "m"
@@ -115,7 +154,7 @@ const (
HOST_USERNAME_DFLT string = "admin"
HOST_PASSWORD_DFLT string = "admin12345"
- SIZE_DFLT string = "0"
+ SIZE_DFLT string = "8g"
MEMORY_QOS_DFLT = 4
diff --git a/cli/pkg/serviceLib/flags/usages.go b/cli/pkg/serviceLib/flags/usages.go
new file mode 100644
index 0000000..1cafbea
--- /dev/null
+++ b/cli/pkg/serviceLib/flags/usages.go
@@ -0,0 +1,196 @@
+// Copyright (c) 2024 Seagate Technology LLC and/or its Affiliates
+package flags
+
+import "fmt"
+
+// Family of getter functions to allow retrieval of consistent strings, for each option, when building the cobra.Command Usage field string across multiple commands.
+//
+// Usage syntax is defined as follows:
+// 1.) Square Brackets [ ]: Indicate optional elements. For example, in command [option], the option is not required for the command to run.
+// 2.) Angle Brackets < >: Often used to denote placeholders for user-supplied values, such as command .
+// 3.) Curly Braces { }: Indicate a set of choices, where you must choose one. For example, command {start|stop|restart} means you must choose one of start, stop, or restart.
+// 4.) Vertical Bar |: Used within curly braces to separate choices, as shown above.
+// 5.) Ellipsis ...: Indicates that the preceding element can be repeated multiple times. For example, command [option]... means you can use multiple options.
+// 6.) Parentheses ( ): Sometimes used to group elements together, though less common in man pages.
+// 7.) Bold Text: Typically used to show the command itself or mandatory elements.
+// 8.) Italic Text: Used for arguments or variables that the user must replace with actual values.
+
+// formatUsage - Generates a formatted usage string for a single command option.
+// Used for every option in the cobra.Command.Use field.
+// This function is meant to be called multiple times to consistently generate a complete string that represents the usage for a single cli command option.
+// String format(using all available features): [--option | -o ]
+func formatUsage(option, shorthand, entry string, optional bool) string {
+ usage := fmt.Sprintf("{--%s | -%s}", option, shorthand)
+
+ if entry != "" {
+ usage = fmt.Sprintf("%s <%s>", usage, entry)
+ }
+
+ if optional {
+ usage = fmt.Sprintf("[%s]", usage)
+ } // else {
+ // usage = fmt.Sprintf("(%s)", usage)
+ // }
+
+ return usage
+}
+
+func GetOptionUsageGroupServiceTcp(optional bool) string {
+ return fmt.Sprintf("%s %s %s %s",
+ GetOptionUsageServiceIp(optional),
+ GetOptionUsageServicePort(optional),
+ GetOptionUsageServiceInsecure(optional),
+ GetOptionUsageServiceProtocol(optional))
+}
+
+func GetOptionUsageServiceIp(optional bool) string {
+ return formatUsage(SERVICE_NET_IP, SERVICE_NET_IP_SH, "ip_address", optional)
+}
+
+func GetOptionUsageServicePort(optional bool) string {
+ return formatUsage(SERVICE_NET_PORT, SERVICE_NET_PORT_SH, PORT, optional)
+}
+
+func GetOptionUsageServiceInsecure(optional bool) string {
+ return formatUsage(SERVICE_INSECURE, SERVICE_INSECURE_SH, "", optional)
+}
+
+func GetOptionUsageServiceProtocol(optional bool) string {
+ return formatUsage(SERVICE_PROTOCOL, SERVICE_PROTOCOL_SH, PROTOCOL, optional)
+}
+
+func GetOptionUsageApplianceId(optional bool) string {
+ return formatUsage(APPLIANCE_ID, APPLIANCE_ID_SH, "applianceId", optional)
+}
+
+func GetOptionUsageBladeId(optional bool) string {
+ return formatUsage(BLADE_ID, BLADE_ID_SH, "bladeId", optional)
+}
+
+func GetOptionUsageHostId(optional bool) string {
+ return formatUsage(HOST_ID, HOST_ID_SH, "hostId", optional)
+}
+
+func GetOptionUsageNewId(optional bool) string {
+ return formatUsage(NEW_ID, NEW_ID_SH, "newId", optional)
+}
+
+func GetOptionUsageApplianceUsername(optional bool) string {
+ return formatUsage(APPLIANCE_USERNAME, APPLIANCE_USERNAME_SH, USERNAME, optional)
+}
+
+func GetOptionUsageAppliancePassword(optional bool) string {
+ return formatUsage(APPLIANCE_PASSWORD, APPLIANCE_PASSWORD_SH, PASSWORD, optional)
+}
+
+func GetOptionUsageGroupApplianceTcp(optional bool) string {
+ return fmt.Sprintf("%s %s %s %s",
+ GetOptionUsageApplianceIp(optional),
+ GetOptionUsageAppliancePort(optional),
+ GetOptionUsageApplianceInsecure(optional),
+ GetOptionUsageApplianceProtocol(optional))
+}
+
+func GetOptionUsageApplianceIp(optional bool) string {
+ return formatUsage(APPLIANCE_NET_IP, APPLIANCE_NET_IP_SH, "ip_address", optional)
+}
+
+func GetOptionUsageAppliancePort(optional bool) string {
+ return formatUsage(APPLIANCE_NET_PORT, APPLIANCE_NET_PORT_SH, PORT, optional)
+}
+
+func GetOptionUsageApplianceInsecure(optional bool) string {
+ return formatUsage(APPLIANCE_INSECURE, APPLIANCE_INSECURE_SH, "", optional)
+}
+
+func GetOptionUsageApplianceProtocol(optional bool) string {
+ return formatUsage(APPLIANCE_PROTOCOL, APPLIANCE_PROTOCOL_SH, PROTOCOL, optional)
+}
+
+func GetOptionUsageBladeUsername(optional bool) string {
+ return formatUsage(BLADE_USERNAME, BLADE_USERNAME_SH, USERNAME, optional)
+}
+
+func GetOptionUsageBladePassword(optional bool) string {
+ return formatUsage(BLADE_PASSWORD, BLADE_PASSWORD_SH, PASSWORD, optional)
+}
+
+func GetOptionUsageGroupBladeTcp(optional bool) string {
+ return fmt.Sprintf("%s %s %s %s",
+ GetOptionUsageBladeIp(optional),
+ GetOptionUsageBladePort(optional),
+ GetOptionUsageBladeInsecure(optional),
+ GetOptionUsageBladeProtocol(optional))
+}
+
+func GetOptionUsageBladeIp(optional bool) string {
+ return formatUsage(BLADE_NET_IP, BLADE_NET_IP_SH, "ip_address", optional)
+}
+
+func GetOptionUsageBladePort(optional bool) string {
+ return formatUsage(BLADE_NET_PORT, BLADE_NET_PORT_SH, PORT, optional)
+}
+
+func GetOptionUsageBladeInsecure(optional bool) string {
+ return formatUsage(BLADE_INSECURE, BLADE_INSECURE_SH, "", optional)
+}
+
+func GetOptionUsageBladeProtocol(optional bool) string {
+ return formatUsage(BLADE_PROTOCOL, BLADE_PROTOCOL_SH, PROTOCOL, optional)
+}
+
+func GetOptionUsageHostUsername(optional bool) string {
+ return formatUsage(HOST_USERNAME, HOST_USERNAME_SH, USERNAME, optional)
+}
+
+func GetOptionUsageHostPassword(optional bool) string {
+ return formatUsage(HOST_PASSWORD, HOST_PASSWORD_SH, PASSWORD, optional)
+}
+
+func GetOptionUsageGroupHostTcp(optional bool) string {
+ return fmt.Sprintf("%s %s %s %s",
+ GetOptionUsageHostIp(optional),
+ GetOptionUsageHostPort(optional),
+ GetOptionUsageHostInsecure(optional),
+ GetOptionUsageHostProtocol(optional))
+}
+
+func GetOptionUsageHostIp(optional bool) string {
+ return formatUsage(HOST_NET_IP, HOST_NET_IP_SH, "ip_address", optional)
+}
+
+func GetOptionUsageHostPort(optional bool) string {
+ return formatUsage(HOST_NET_PORT, HOST_NET_PORT_SH, PORT, optional)
+}
+
+func GetOptionUsageHostInsecure(optional bool) string {
+ return formatUsage(HOST_INSECURE, HOST_INSECURE_SH, "", optional)
+}
+
+func GetOptionUsageHostProtocol(optional bool) string {
+ return formatUsage(HOST_PROTOCOL, HOST_PROTOCOL_SH, PROTOCOL, optional)
+}
+
+func GetOptionUsageMemoryId(optional bool) string {
+ return formatUsage(MEMORY_ID, MEMORY_ID_SH, "memoryId", optional)
+}
+
+func GetOptionUsageMemoryQos(optional bool) string {
+ return formatUsage(MEMORY_QOS, MEMORY_QOS_SH, QOS, optional)
+}
+
+func GetOptionUsageMemoryDeviceId(optional bool) string {
+ return formatUsage(MEMORY_DEVICE_ID, MEMORY_DEVICE_ID_SH, "memdevId", optional)
+}
+
+func GetOptionUsagePortId(optional bool) string {
+ return formatUsage(PORT_ID, PORT_ID_SH, "portId", optional)
+}
+
+func GetOptionUsageResourceId(optional bool) string {
+ return formatUsage(RESOURCE_ID, RESOURCE_ID_SH, "resourceId", optional)
+}
+
+func GetOptionUsageResourceSize(optional bool) string {
+ return formatUsage(RESOURCE_SIZE, RESOURCE_SIZE_SH, SIZE, optional)
+}
diff --git a/cli/pkg/serviceLib/serviceRequests/appliances.go b/cli/pkg/serviceLib/serviceRequests/appliances.go
index 5adacb4..57f3228 100644
--- a/cli/pkg/serviceLib/serviceRequests/appliances.go
+++ b/cli/pkg/serviceLib/serviceRequests/appliances.go
@@ -28,8 +28,8 @@ func NewServiceRequestAddAppliance(cmd *cobra.Command) *ServiceRequestAddApplian
return &ServiceRequestAddAppliance{
ServiceTcp: NewTcpInfo(cmd, flags.SERVICE),
ApplianceId: NewId(cmd, flags.APPLIANCE),
- ApplianceCred: NewDeviceCredentials(cmd, flags.DEVICE),
- ApplianceTcp: NewTcpInfo(cmd, flags.DEVICE),
+ ApplianceCred: NewDeviceCredentials(cmd, flags.APPLIANCE),
+ ApplianceTcp: NewTcpInfo(cmd, flags.APPLIANCE),
}
}
diff --git a/cli/pkg/serviceLib/serviceRequests/blades.go b/cli/pkg/serviceLib/serviceRequests/blades.go
index 5b0911e..5591a1e 100644
--- a/cli/pkg/serviceLib/serviceRequests/blades.go
+++ b/cli/pkg/serviceLib/serviceRequests/blades.go
@@ -27,8 +27,8 @@ func NewServiceRequestAddBlade(cmd *cobra.Command) *ServiceRequestAddBlade {
ServiceTcp: NewTcpInfo(cmd, flags.SERVICE),
ApplianceId: NewId(cmd, flags.APPLIANCE),
BladeId: NewId(cmd, flags.BLADE),
- BladeCred: NewDeviceCredentials(cmd, flags.DEVICE),
- BladeTcp: NewTcpInfo(cmd, flags.DEVICE),
+ BladeCred: NewDeviceCredentials(cmd, flags.BLADE),
+ BladeTcp: NewTcpInfo(cmd, flags.BLADE),
}
}
diff --git a/cli/pkg/serviceLib/serviceRequests/hosts.go b/cli/pkg/serviceLib/serviceRequests/hosts.go
index 2634bda..c3e41d4 100644
--- a/cli/pkg/serviceLib/serviceRequests/hosts.go
+++ b/cli/pkg/serviceLib/serviceRequests/hosts.go
@@ -25,8 +25,8 @@ func NewServiceRequestAddHost(cmd *cobra.Command) *ServiceRequestAddHost {
return &ServiceRequestAddHost{
ServiceTcp: NewTcpInfo(cmd, flags.SERVICE),
HostId: NewId(cmd, flags.HOST),
- HostCred: NewDeviceCredentials(cmd, flags.DEVICE),
- HostTcp: NewTcpInfo(cmd, flags.DEVICE),
+ HostCred: NewDeviceCredentials(cmd, flags.HOST),
+ HostTcp: NewTcpInfo(cmd, flags.HOST),
}
}
diff --git a/cmd/cfm-cli/cmd/addAppliance.go b/cmd/cfm-cli/cmd/addAppliance.go
index 0e0990c..45855cc 100644
--- a/cmd/cfm-cli/cmd/addAppliance.go
+++ b/cmd/cfm-cli/cmd/addAppliance.go
@@ -5,20 +5,18 @@ package cmd
import (
"cfm/cli/pkg/serviceLib/flags"
"cfm/cli/pkg/serviceLib/serviceRequests"
+ "fmt"
"github.com/spf13/cobra"
)
var addApplianceCmd = &cobra.Command{
- Use: `appliance [--serv-ip | -a] [--serv-net-port | -p] [--appliance-id | -L]`,
+ Use: GetCmdUsageAddAppliance(),
Short: "Add a memory appliance to cfm-service",
- Long: `Create a virtual memeory appliance within the cfm-service.
+ Long: `Create a virtual memory appliance within the cfm-service.
Use "cfm add blade" to add composable memory to the appliance.`,
- Example: `
- cfm add appliance --serv-ip 127.0.0.1 --serv-net-port 8080 --appliance-id userDefinedId
-
- cfm add appliance -a 127.0.0.1 -p 8080 -L userDefinedId`,
- Args: cobra.MatchAll(cobra.NoArgs),
+ Example: GetCmdExampleAddAppliance(),
+ Args: cobra.MatchAll(cobra.NoArgs),
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
initLogging(cmd)
return nil
@@ -40,17 +38,51 @@ func init() {
initCommonPersistentFlags(addApplianceCmd)
- // Unused by user, but some values are required by cfm-service frontend.
- addApplianceCmd.Flags().StringP(flags.DEVICE_USERNAME, flags.DEVICE_USERNAME_SH, flags.APPLIANCE_USERNAME_DFLT, "Appliance username for authentication")
- addApplianceCmd.Flags().StringP(flags.DEVICE_PASSWORD, flags.DEVICE_PASSWORD_SH, flags.APPLIANCE_PASSWORD_DFLT, "Appliance password for authentication")
+ addApplianceCmd.Flags().StringP(flags.APPLIANCE_ID, flags.APPLIANCE_ID_SH, flags.ID_DFLT, "User-defined ID for target appliance (Optional)\n (default: random w\\ format: memory-appliance-XXXX)")
- addApplianceCmd.Flags().StringP(flags.DEVICE_NET_IP, flags.DEVICE_NET_IP_SH, flags.APPLIANCE_NET_IP_DFLT, "Appliance network IP address")
- addApplianceCmd.Flags().Uint16P(flags.DEVICE_NET_PORT, flags.DEVICE_NET_PORT_SH, flags.APPLIANCE_NET_PORT_DFLT, "Appliance network port ")
- addApplianceCmd.Flags().BoolP(flags.DEVICE_INSECURE, flags.DEVICE_INSECURE_SH, flags.APPLIANCE_INSECURE_DFLT, "Appliance insecure connection flag")
- addApplianceCmd.Flags().StringP(flags.DEVICE_PROTOCOL, flags.DEVICE_PROTOCOL_SH, flags.APPLIANCE_PROTOCOL_DFLT, "Appliance network connection protocol (http/https)")
+ // Unused by user, but values are required by cfm-service client frontend.
+ addApplianceCmd.Flags().StringP(flags.APPLIANCE_USERNAME, flags.APPLIANCE_USERNAME_SH, flags.APPLIANCE_USERNAME_DFLT, "Appliance username for authentication\n")
+ addApplianceCmd.Flags().StringP(flags.APPLIANCE_PASSWORD, flags.APPLIANCE_PASSWORD_SH, flags.APPLIANCE_PASSWORD_DFLT, "Appliance password for authentication\n")
+ addApplianceCmd.Flags().MarkHidden(flags.APPLIANCE_USERNAME)
+ addApplianceCmd.Flags().MarkHidden(flags.APPLIANCE_PASSWORD)
- addApplianceCmd.Flags().StringP(flags.APPLIANCE_ID, flags.APPLIANCE_ID_SH, flags.ID_DFLT, "User-defined ID for target appliance")
+ addApplianceCmd.Flags().StringP(flags.APPLIANCE_NET_IP, flags.APPLIANCE_NET_IP_SH, flags.APPLIANCE_NET_IP_DFLT, "Appliance network IP address\n")
+ addApplianceCmd.Flags().Uint16P(flags.APPLIANCE_NET_PORT, flags.APPLIANCE_NET_PORT_SH, flags.APPLIANCE_NET_PORT_DFLT, "Appliance network port\n")
+ addApplianceCmd.Flags().BoolP(flags.APPLIANCE_INSECURE, flags.APPLIANCE_INSECURE_SH, flags.APPLIANCE_INSECURE_DFLT, "Appliance insecure connection flag\n (default false)")
+ addApplianceCmd.Flags().StringP(flags.APPLIANCE_PROTOCOL, flags.APPLIANCE_PROTOCOL_SH, flags.APPLIANCE_PROTOCOL_DFLT, "Appliance network connection protocol (http/https)\n")
+ addApplianceCmd.Flags().MarkHidden(flags.APPLIANCE_NET_IP)
+ addApplianceCmd.Flags().MarkHidden(flags.APPLIANCE_NET_PORT)
+ addApplianceCmd.Flags().MarkHidden(flags.APPLIANCE_INSECURE)
+ addApplianceCmd.Flags().MarkHidden(flags.APPLIANCE_PROTOCOL)
//Add command to parent
addCmd.AddCommand(addApplianceCmd)
}
+
+// GetCmdUsageAddAppliance - Generates the command usage string for the cobra.Command.Use field.
+func GetCmdUsageAddAppliance() string {
+ return fmt.Sprintf("%s %s %s",
+ flags.APPLIANCE, // Note: The first word in the Command.Use string is how Cobra defines the "name" of this "command".
+ flags.GetOptionUsageGroupServiceTcp(false),
+ flags.GetOptionUsageApplianceId(true))
+}
+
+// GetCmdExampleAddAppliance - Generates the command example string for the cobra.Command.Example field.
+func GetCmdExampleAddAppliance() string {
+ baseCmd := fmt.Sprintf("cfm add %s", flags.APPLIANCE)
+
+ shorthandFormat := fmt.Sprintf("%s %s %s",
+ baseCmd,
+ flags.GetOptionExampleShGroupServiceTcp(),
+ flags.GetOptionExampleShApplianceId())
+
+ longhandFormat := fmt.Sprintf("%s %s %s",
+ baseCmd,
+ flags.GetOptionExampleLhGroupServiceTcp(),
+ flags.GetOptionExampleLhApplianceId())
+
+ return fmt.Sprintf(`
+ %s
+
+ %s`, shorthandFormat, longhandFormat)
+}
diff --git a/cmd/cfm-cli/cmd/addBlade.go b/cmd/cfm-cli/cmd/addBlade.go
index 70e71d8..e22e965 100644
--- a/cmd/cfm-cli/cmd/addBlade.go
+++ b/cmd/cfm-cli/cmd/addBlade.go
@@ -5,20 +5,17 @@ package cmd
import (
"cfm/cli/pkg/serviceLib/flags"
"cfm/cli/pkg/serviceLib/serviceRequests"
+ "fmt"
"github.com/spf13/cobra"
)
var addBladeCmd = &cobra.Command{
- Use: `blade <--appliance-id | -L> [--dev-username | -R] [--dev-password | -W] [--serv-ip | -a] [--serv-net-port | -p]
- [--blade-id | -B] [--dev-ip | -A] [--dev-net-port | -P] [--dev-insecure | -S] [--dev-protocol | -T]`,
- Short: "Add a memory appliance blade connection to cfm-service",
- Long: `Adds a netowrk connection from the cfm-service to an external memory appliance blade.`,
- Example: `
- cfm add blade --serv-ip 127.0.0.1 --serv-net-port 8080 --appliance-id applId --blade-id userDefinedId --dev-username user --dev-password pswd --dev-ip 127.0.0.1 --dev-net-port 7443 --dev-insecure --dev-protocol https
-
- cfm add blade -a 127.0.0.1 -p 8080 -L applId -B userDefinedId -R user -W pswd -A 127.0.0.1 -P 7443 -S -T https`,
- Args: cobra.MatchAll(cobra.NoArgs),
+ Use: GetCmdUsageAddBlade(),
+ Short: "Add a memory appliance blade connection to cfm-service",
+ Long: `Adds a netowrk connection from the cfm-service to an external memory appliance blade.`,
+ Example: GetCmdExampleAddBlade(),
+ Args: cobra.MatchAll(cobra.NoArgs),
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
initLogging(cmd)
return nil
@@ -40,20 +37,60 @@ func init() {
initCommonPersistentFlags(addBladeCmd)
- addBladeCmd.Flags().StringP(flags.DEVICE_USERNAME, flags.DEVICE_USERNAME_SH, flags.BLADE_USERNAME_DFLT, "Blade username for authentication")
- // addBladeCmd.MarkFlagRequired(flags.DEVICE_USERNAME)
- addBladeCmd.Flags().StringP(flags.DEVICE_PASSWORD, flags.DEVICE_PASSWORD_SH, flags.BLADE_PASSWORD_DFLT, "Blade password for authentication")
- // addBladeCmd.MarkFlagRequired(flags.DEVICE_PASSWORD)
+ addBladeCmd.Flags().StringP(flags.BLADE_USERNAME, flags.BLADE_USERNAME_SH, flags.BLADE_USERNAME_DFLT, "Blade username for authentication\n")
+ // addBladeCmd.MarkFlagRequired(flags.BLADE_USERNAME)
+ addBladeCmd.Flags().StringP(flags.BLADE_PASSWORD, flags.BLADE_PASSWORD_SH, flags.BLADE_PASSWORD_DFLT, "Blade password for authentication\n")
+ // addBladeCmd.MarkFlagRequired(flags.BLADE_PASSWORD)
- addBladeCmd.Flags().StringP(flags.DEVICE_NET_IP, flags.DEVICE_NET_IP_SH, flags.BLADE_NET_IP_DFLT, "Blade network IP address")
- addBladeCmd.Flags().Uint16P(flags.DEVICE_NET_PORT, flags.DEVICE_NET_PORT_SH, flags.BLADE_NET_PORT_DFLT, "Blade network port ")
- addBladeCmd.Flags().BoolP(flags.DEVICE_INSECURE, flags.DEVICE_INSECURE_SH, flags.BLADE_INSECURE_DFLT, "Blade insecure connection flag")
- addBladeCmd.Flags().StringP(flags.DEVICE_PROTOCOL, flags.DEVICE_PROTOCOL_SH, flags.BLADE_PROTOCOL_DFLT, "Blade network connection protocol (http/https)")
+ addBladeCmd.Flags().StringP(flags.BLADE_NET_IP, flags.BLADE_NET_IP_SH, flags.BLADE_NET_IP_DFLT, "Blade network IP address\n")
+ addBladeCmd.Flags().Uint16P(flags.BLADE_NET_PORT, flags.BLADE_NET_PORT_SH, flags.BLADE_NET_PORT_DFLT, "Blade network port\n")
+ addBladeCmd.Flags().BoolP(flags.BLADE_INSECURE, flags.BLADE_INSECURE_SH, flags.BLADE_INSECURE_DFLT, "Blade insecure connection flag\n (default false)")
+ addBladeCmd.Flags().StringP(flags.BLADE_PROTOCOL, flags.BLADE_PROTOCOL_SH, flags.BLADE_PROTOCOL_DFLT, "Blade network connection protocol (http/https)\n")
- addBladeCmd.Flags().StringP(flags.APPLIANCE_ID, flags.APPLIANCE_ID_SH, flags.ID_DFLT, "Appliance ID of target blade")
+ addBladeCmd.Flags().StringP(flags.APPLIANCE_ID, flags.APPLIANCE_ID_SH, flags.ID_DFLT, "Appliance ID of target blade\n")
addBladeCmd.MarkFlagRequired(flags.APPLIANCE_ID)
- addBladeCmd.Flags().StringP(flags.BLADE_ID, flags.BLADE_ID_SH, flags.ID_DFLT, "User-defined ID for target blade")
+ addBladeCmd.Flags().StringP(flags.BLADE_ID, flags.BLADE_ID_SH, flags.ID_DFLT, "User-defined ID for target blade (Optional)\n (default: random w\\ format: blade-XXXX)")
//Add command to parent
addCmd.AddCommand(addBladeCmd)
}
+
+// GetCmdUsageAddBlade - Generates the command usage string for the cobra.Command.Use field.
+func GetCmdUsageAddBlade() string {
+ return fmt.Sprintf("%s %s %s %s %s %s %s",
+ flags.BLADE, // Note: The first word in the Command.Use string is how Cobra defines the "name" of this "command".
+ flags.GetOptionUsageGroupServiceTcp(false),
+ flags.GetOptionUsageApplianceId(false),
+ flags.GetOptionUsageBladeId(true),
+ flags.GetOptionUsageGroupBladeTcp(false),
+ flags.GetOptionUsageBladeUsername(false),
+ flags.GetOptionUsageBladePassword(false))
+}
+
+// GetCmdExampleAddBlade - Generates the command example string for the cobra.Command.Example field.
+func GetCmdExampleAddBlade() string {
+ baseCmd := fmt.Sprintf("cfm add %s", flags.BLADE)
+
+ shorthandFormat := fmt.Sprintf("%s %s %s %s %s %s %s",
+ baseCmd,
+ flags.GetOptionExampleShGroupServiceTcp(),
+ flags.GetOptionExampleShApplianceId(),
+ flags.GetOptionExampleShBladeId(),
+ flags.GetOptionExampleShGroupBladeTcp(),
+ flags.GetOptionExampleShBladeUsername(),
+ flags.GetOptionExampleShBladePassword())
+
+ longhandFormat := fmt.Sprintf("%s %s %s %s %s %s %s",
+ baseCmd,
+ flags.GetOptionExampleLhGroupServiceTcp(),
+ flags.GetOptionExampleLhApplianceId(),
+ flags.GetOptionExampleLhBladeId(),
+ flags.GetOptionExampleLhGroupBladeTcp(),
+ flags.GetOptionExampleLhBladeUsername(),
+ flags.GetOptionExampleLhBladePassword())
+
+ return fmt.Sprintf(`
+ %s
+
+ %s`, shorthandFormat, longhandFormat)
+}
diff --git a/cmd/cfm-cli/cmd/addHost.go b/cmd/cfm-cli/cmd/addHost.go
index 75a6b1b..6d18840 100644
--- a/cmd/cfm-cli/cmd/addHost.go
+++ b/cmd/cfm-cli/cmd/addHost.go
@@ -5,21 +5,18 @@ package cmd
import (
"cfm/cli/pkg/serviceLib/flags"
"cfm/cli/pkg/serviceLib/serviceRequests"
+ "fmt"
"github.com/spf13/cobra"
)
// addHostCmd represents the addHost command
var addHostCmd = &cobra.Command{
- Use: `host [--dev-username | -R] [--dev-password | -W] [--serv-ip | -a] [--serv-net-port | -p]
- [--host-id | -H] [--dev-ip | -A] [--dev-net-port | -P] [--dev-insecure | -S] [--dev-protocol | -T]`,
- Short: "Add a cxl host connection to cfm-service",
- Long: `Adds a netowrk connection from the cfm-service to an external cxl host.`,
- Example: `
- cfm add host --serv-ip 127.0.0.1 --serv-net-port 8080 --host-id userDefinedId --dev-username user --dev-password pswd --dev-ip 127.0.0.1 --dev-net-port 7443 --dev-insecure --dev-protocol https
-
- cfm add host -a 127.0.0.1 -p 8080 -H userDefinedId -R user -W pswd -A 127.0.0.1 -P 7443 -S -T https`,
- Args: cobra.MatchAll(cobra.NoArgs),
+ Use: GetCmdUsageAddHost(),
+ Short: "Add a cxl host connection to cfm-service",
+ Long: `Adds a netowrk connection from the cfm-service to an external cxl host.`,
+ Example: GetCmdExampleAddHost(),
+ Args: cobra.MatchAll(cobra.NoArgs),
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
initLogging(cmd)
return nil
@@ -41,18 +38,55 @@ func init() {
initCommonPersistentFlags(addHostCmd)
- addHostCmd.Flags().StringP(flags.DEVICE_USERNAME, flags.DEVICE_USERNAME_SH, flags.HOST_USERNAME_DFLT, "Host username for authentication")
- // addHostCmd.MarkFlagRequired(flags.DEVICE_USERNAME)
- addHostCmd.Flags().StringP(flags.DEVICE_PASSWORD, flags.DEVICE_PASSWORD_SH, flags.HOST_PASSWORD_DFLT, "Host password for authentication")
- // addHostCmd.MarkFlagRequired(flags.DEVICE_PASSWORD)
+ addHostCmd.Flags().StringP(flags.HOST_USERNAME, flags.HOST_USERNAME_SH, flags.HOST_USERNAME_DFLT, "Host(CXL) username for authentication\n")
+ // addHostCmd.MarkFlagRequired(flags.HOST_USERNAME)
+ addHostCmd.Flags().StringP(flags.HOST_PASSWORD, flags.HOST_PASSWORD_SH, flags.HOST_PASSWORD_DFLT, "Host(CXL) password for authentication\n")
+ // addHostCmd.MarkFlagRequired(flags.HOST_PASSWORD)
- addHostCmd.Flags().StringP(flags.DEVICE_NET_IP, flags.DEVICE_NET_IP_SH, flags.HOST_NET_IP_DFLT, "Host network IP address")
- addHostCmd.Flags().Uint16P(flags.DEVICE_NET_PORT, flags.DEVICE_NET_PORT_SH, flags.HOST_NET_PORT_DFLT, "Host network port ")
- addHostCmd.Flags().BoolP(flags.DEVICE_INSECURE, flags.DEVICE_INSECURE_SH, flags.HOST_INSECURE_DFLT, "Host insecure connection flag")
- addHostCmd.Flags().StringP(flags.DEVICE_PROTOCOL, flags.DEVICE_PROTOCOL_SH, flags.HOST_PROTOCOL_DFLT, "Host network connection protocol (http/https)")
+ addHostCmd.Flags().StringP(flags.HOST_NET_IP, flags.HOST_NET_IP_SH, flags.HOST_NET_IP_DFLT, "Host(CXL) network IP address\n")
+ addHostCmd.Flags().Uint16P(flags.HOST_NET_PORT, flags.HOST_NET_PORT_SH, flags.HOST_NET_PORT_DFLT, "Host(CXL) network port\n")
+ addHostCmd.Flags().BoolP(flags.HOST_INSECURE, flags.HOST_INSECURE_SH, flags.HOST_INSECURE_DFLT, "Host(CXL) insecure connection flag\n (default false)")
+ addHostCmd.Flags().StringP(flags.HOST_PROTOCOL, flags.HOST_PROTOCOL_SH, flags.HOST_PROTOCOL_DFLT, "Host(CXL) network connection protocol (http/https)\n")
- addHostCmd.Flags().StringP(flags.HOST_ID, flags.HOST_ID_SH, flags.ID_DFLT, "User-defined ID for target host")
+ addHostCmd.Flags().StringP(flags.HOST_ID, flags.HOST_ID_SH, flags.ID_DFLT, "User-defined ID for target host(CXL) (Optional)\n (default: random w\\ format: host-XXXX)")
//Add command to parent
addCmd.AddCommand(addHostCmd)
}
+
+// GetCmdUsageAddHost - Generates the command usage string for the cobra.Command.Use field.
+func GetCmdUsageAddHost() string {
+ return fmt.Sprintf("%s %s %s %s %s %s",
+ flags.HOST, // Note: The first word in the Command.Use string is how Cobra defines the "name" of this "command".
+ flags.GetOptionUsageGroupServiceTcp(false),
+ flags.GetOptionUsageHostId(true),
+ flags.GetOptionUsageGroupHostTcp(false),
+ flags.GetOptionUsageHostUsername(false),
+ flags.GetOptionUsageHostPassword(false))
+}
+
+// GetCmdExampleAddHost - Generates the command example string for the cobra.Command.Example field.
+func GetCmdExampleAddHost() string {
+ baseCmd := fmt.Sprintf("cfm add %s", flags.HOST)
+
+ shorthandFormat := fmt.Sprintf("%s %s %s %s %s %s",
+ baseCmd,
+ flags.GetOptionExampleShGroupServiceTcp(),
+ flags.GetOptionExampleShHostId(),
+ flags.GetOptionExampleShGroupHostTcp(),
+ flags.GetOptionExampleShHostUsername(),
+ flags.GetOptionExampleShHostPassword())
+
+ longhandFormat := fmt.Sprintf("%s %s %s %s %s %s",
+ baseCmd,
+ flags.GetOptionExampleLhGroupServiceTcp(),
+ flags.GetOptionExampleLhHostId(),
+ flags.GetOptionExampleLhGroupHostTcp(),
+ flags.GetOptionExampleLhHostUsername(),
+ flags.GetOptionExampleLhHostPassword())
+
+ return fmt.Sprintf(`
+ %s
+
+ %s`, shorthandFormat, longhandFormat)
+}
diff --git a/cmd/cfm-cli/cmd/assignBlade.go b/cmd/cfm-cli/cmd/assignBlade.go
index 132d81e..05b926e 100644
--- a/cmd/cfm-cli/cmd/assignBlade.go
+++ b/cmd/cfm-cli/cmd/assignBlade.go
@@ -11,14 +11,11 @@ import (
)
var assignBladeCmd = &cobra.Command{
- Use: "blade [--serv-ip | -a] [--serv-net-port | -p] <--appliance-id | -L> <--blade-id | -B> <--memory-id | -m> <--port-id | -o>",
- Short: "Assign an existing blade memory region to a blade port.",
- Long: `Assign an existing blade memory region to a blade port. A physical connection must already exist between the appliance blade and the target cxl-host.`,
- Example: `
- cfm assign blade --serv-ip 127.0.0.1 --serv-net-port 8080 --appliance-id applId --blade-id bladeId --memory-id memoryId --port-id portId
-
- cfm assign blade -a 127.0.0.1 -p 8080 -L applId -B bladeId -m memoryId -o portId`,
- Args: cobra.MatchAll(cobra.NoArgs),
+ Use: GetCmdUsageAssignBlade(),
+ Short: "Assign an existing blade memory region to a blade port.",
+ Long: `Assign an existing blade memory region to a blade port. A physical connection must already exist between the appliance blade and the target cxl-host.`,
+ Example: GetCmdExampleAssignBlade(),
+ Args: cobra.MatchAll(cobra.NoArgs),
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
initLogging(cmd)
return nil
@@ -44,13 +41,13 @@ var assignBladeCmd = &cobra.Command{
func init() {
assignBladeCmd.DisableFlagsInUseLine = true
- assignBladeCmd.Flags().StringP(flags.APPLIANCE_ID, flags.APPLIANCE_ID_SH, flags.ID_DFLT, "ID of appliance to interrogate")
+ assignBladeCmd.Flags().StringP(flags.APPLIANCE_ID, flags.APPLIANCE_ID_SH, flags.ID_DFLT, "ID of appliance to interrogate\n")
assignBladeCmd.MarkFlagRequired(flags.APPLIANCE_ID)
- assignBladeCmd.Flags().StringP(flags.BLADE_ID, flags.BLADE_ID_SH, flags.ID_DFLT, "ID of appliance blade to interrogate")
+ assignBladeCmd.Flags().StringP(flags.BLADE_ID, flags.BLADE_ID_SH, flags.ID_DFLT, "ID of appliance blade to interrogate\n")
assignBladeCmd.MarkFlagRequired(flags.BLADE_ID)
- assignBladeCmd.Flags().StringP(flags.MEMORY_ID, flags.MEMORY_ID_SH, flags.ID_DFLT, "ID of the appliance blade memory region to assign to the specified port.")
+ assignBladeCmd.Flags().StringP(flags.MEMORY_ID, flags.MEMORY_ID_SH, flags.ID_DFLT, "ID of the appliance blade memory region to assign to the specified port\n")
assignBladeCmd.MarkFlagRequired(flags.MEMORY_ID)
- assignBladeCmd.Flags().StringP(flags.PORT_ID, flags.PORT_ID_SH, flags.ID_DFLT, "ID of the appliance blade port to assign to the specified memory region.")
+ assignBladeCmd.Flags().StringP(flags.PORT_ID, flags.PORT_ID_SH, flags.ID_DFLT, "ID of the appliance blade port to assign to the specified memory region\n")
assignBladeCmd.MarkFlagRequired(flags.PORT_ID)
initCommonPersistentFlags(assignBladeCmd)
@@ -58,3 +55,40 @@ func init() {
//Add command to parent
assignCmd.AddCommand(assignBladeCmd)
}
+
+// GetCmdUsageAssignBlade - Generates the command usage string for the cobra.Command.Use field.
+func GetCmdUsageAssignBlade() string {
+ return fmt.Sprintf("%s %s %s %s %s %s",
+ flags.BLADE, // Note: The first word in the Command.Use string is how Cobra defines the "name" of this "command".
+ flags.GetOptionUsageGroupServiceTcp(false),
+ flags.GetOptionUsageApplianceId(false),
+ flags.GetOptionUsageBladeId(false),
+ flags.GetOptionUsageMemoryId(false),
+ flags.GetOptionUsagePortId(false))
+}
+
+// GetCmdExampleAssignBlade - Generates the command example string for the cobra.Command.Example field.
+func GetCmdExampleAssignBlade() string {
+ baseCmd := fmt.Sprintf("cfm assign %s", flags.BLADE)
+
+ shorthandFormat := fmt.Sprintf("%s %s %s %s %s %s",
+ baseCmd,
+ flags.GetOptionExampleShGroupServiceTcp(),
+ flags.GetOptionExampleShApplianceId(),
+ flags.GetOptionExampleShBladeId(),
+ flags.GetOptionExampleShMemoryId(),
+ flags.GetOptionExampleShPortId())
+
+ longhandFormat := fmt.Sprintf("%s %s %s %s %s %s",
+ baseCmd,
+ flags.GetOptionExampleLhGroupServiceTcp(),
+ flags.GetOptionExampleLhApplianceId(),
+ flags.GetOptionExampleLhBladeId(),
+ flags.GetOptionExampleLhMemoryId(),
+ flags.GetOptionExampleLhPortId())
+
+ return fmt.Sprintf(`
+ %s
+
+ %s`, shorthandFormat, longhandFormat)
+}
diff --git a/cmd/cfm-cli/cmd/composeBlade.go b/cmd/cfm-cli/cmd/composeBlade.go
index 242595c..f240d88 100644
--- a/cmd/cfm-cli/cmd/composeBlade.go
+++ b/cmd/cfm-cli/cmd/composeBlade.go
@@ -11,14 +11,11 @@ import (
)
var composeBladeCmd = &cobra.Command{
- Use: "blade [--serv-ip | -a] [--serv-net-port | -p] <--appliance-id | -L> <--blade-id | -B> [--port-id | -i] <--resource-size | -z> [--memory-qos | -q]",
- Short: "Compose a new memory region on the specified memory appliance blade.",
- Long: `Compose a new memory region on the specified memory appliance blade. The composed memory region can be optionally assigned to a specified memory appliance blade port for use by an external device (such as a cxl host).`,
- Example: `
- cfm compose blade --serv-ip 127.0.0.1 --serv-net-port 8080 --appliance-id applId --blade-id bladeId --port-id portId --resource-size 32g --memory-qos 4
-
- cfm compose blade -a 127.0.0.1 -p 8080 -L applId -B bladeId -o portId -z 32g -q 4`,
- Args: cobra.MatchAll(cobra.NoArgs),
+ Use: GetCmdUsageComposeBlade(),
+ Short: "Compose a new memory region on the specified memory appliance blade.",
+ Long: `Compose a new memory region on the specified memory appliance blade. The composed memory region can be optionally assigned to a specified memory appliance blade port for use by an external device (such as a cxl host).`,
+ Example: GetCmdExampleComposeBlade(),
+ Args: cobra.MatchAll(cobra.NoArgs),
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
initLogging(cmd)
return nil
@@ -47,17 +44,68 @@ var composeBladeCmd = &cobra.Command{
func init() {
composeBladeCmd.DisableFlagsInUseLine = true
- composeBladeCmd.Flags().StringP(flags.APPLIANCE_ID, flags.APPLIANCE_ID_SH, flags.ID_DFLT, "ID of appliance to interrogate")
+ composeBladeCmd.Flags().StringP(flags.APPLIANCE_ID, flags.APPLIANCE_ID_SH, flags.ID_DFLT, "ID of appliance to interrogate\n")
composeBladeCmd.MarkFlagRequired(flags.APPLIANCE_ID)
- composeBladeCmd.Flags().StringP(flags.BLADE_ID, flags.BLADE_ID_SH, flags.ID_DFLT, "ID of appliance blade to interrogate")
+ composeBladeCmd.Flags().StringP(flags.BLADE_ID, flags.BLADE_ID_SH, flags.ID_DFLT, "ID of appliance blade to interrogate\n")
composeBladeCmd.MarkFlagRequired(flags.BLADE_ID)
- composeBladeCmd.Flags().StringP(flags.PORT_ID, flags.PORT_ID_SH, flags.ID_DFLT, "ID of a specific appliance port.")
- composeBladeCmd.Flags().StringP(flags.RESOURCE_SIZE, flags.RESOURCE_SIZE_SH, flags.SIZE_DFLT, "Total size of new, composed memory region(minimum of 1 GiB). Use 'G' or 'g' to specific GiB.")
+ composeBladeCmd.Flags().StringP(flags.PORT_ID, flags.PORT_ID_SH, flags.ID_DFLT, "ID of a specific appliance port\n")
+ composeBladeCmd.Flags().StringP(flags.RESOURCE_SIZE, flags.RESOURCE_SIZE_SH, flags.SIZE_DFLT, "Total size of new, composed memory region(minimum of 1 GiB). Use 'G' or 'g' to specify GiB\n")
composeBladeCmd.MarkFlagRequired(flags.RESOURCE_SIZE)
- composeBladeCmd.Flags().Int32P(flags.MEMORY_QOS, flags.MEMORY_QOS_SH, flags.MEMORY_QOS_DFLT, "NOT YET SUPPORTED, BUT, for now, cfm-service ***REQUIRES*** this to be 4: Quality of Service level.")
+ composeBladeCmd.Flags().Int32P(flags.MEMORY_QOS, flags.MEMORY_QOS_SH, flags.MEMORY_QOS_DFLT, "Quality of Service level (ie: channel bandwidth)\n")
+ composeBladeCmd.MarkFlagRequired(flags.MEMORY_QOS)
initCommonPersistentFlags(composeBladeCmd)
//Add command to parent
composeCmd.AddCommand(composeBladeCmd)
}
+
+// GetCmdUsageComposeBlade - Generates the command usage string for the cobra.Command.Use field.
+func GetCmdUsageComposeBlade() string {
+ return fmt.Sprintf("%s %s %s %s %s %s %s",
+ flags.BLADE, // Note: The first word in the Command.Use string is how Cobra defines the "name" of this "command".
+ flags.GetOptionUsageGroupServiceTcp(false),
+ flags.GetOptionUsageApplianceId(false),
+ flags.GetOptionUsageBladeId(false),
+ flags.GetOptionUsagePortId(true),
+ flags.GetOptionUsageResourceSize(false),
+ flags.GetOptionUsageMemoryQos(false))
+}
+
+// GetCmdExampleComposeBlade - Generates the command example string for the cobra.Command.Example field.
+func GetCmdExampleComposeBlade() string {
+ baseCmd := fmt.Sprintf("cfm compose %s", flags.BLADE)
+
+ shorthandFormat := fmt.Sprintf("%s %s %s %s %s %s %s",
+ baseCmd,
+ flags.GetOptionExampleShGroupServiceTcp(),
+ flags.GetOptionExampleShApplianceId(),
+ flags.GetOptionExampleShBladeId(),
+ flags.GetOptionExampleShPortId(),
+ flags.GetOptionExampleShResourceSize(),
+ flags.GetOptionExampleShMemoryQos())
+
+ shorthandFormat2 := fmt.Sprintf("%s %s %s %s %s %s",
+ baseCmd,
+ flags.GetOptionExampleShGroupServiceTcp(),
+ flags.GetOptionExampleShApplianceId(),
+ flags.GetOptionExampleShBladeId(),
+ flags.GetOptionExampleShResourceSize(),
+ flags.GetOptionExampleShMemoryQos())
+
+ longhandFormat := fmt.Sprintf("%s %s %s %s %s %s %s",
+ baseCmd,
+ flags.GetOptionExampleLhGroupServiceTcp(),
+ flags.GetOptionExampleLhApplianceId(),
+ flags.GetOptionExampleLhBladeId(),
+ flags.GetOptionExampleLhPortId(),
+ flags.GetOptionExampleLhResourceSize(),
+ flags.GetOptionExampleLhMemoryQos())
+
+ return fmt.Sprintf(`
+ %s
+
+ %s
+
+ %s`, shorthandFormat, shorthandFormat2, longhandFormat)
+}
diff --git a/cmd/cfm-cli/cmd/deleteAppliance.go b/cmd/cfm-cli/cmd/deleteAppliance.go
index a683f06..e2af0d4 100644
--- a/cmd/cfm-cli/cmd/deleteAppliance.go
+++ b/cmd/cfm-cli/cmd/deleteAppliance.go
@@ -5,19 +5,17 @@ package cmd
import (
"cfm/cli/pkg/serviceLib/flags"
"cfm/cli/pkg/serviceLib/serviceRequests"
+ "fmt"
"github.com/spf13/cobra"
)
var deleteApplianceCmd = &cobra.Command{
- Use: `appliance [--serv-ip | -a] [--serv-net-port | -p] <--appliance-id | -L>`,
- Short: "Delete a memory appliance connection from cfm-service",
- Long: `Deletes a netowrk connection from the cfm-service to an external memory appliance.`,
- Example: `
- cfm delete appliance --appliance-id applId --serv-ip 127.0.0.1 --serv-net-port 8080
-
- cfm delete appliance -L applId -a 127.0.0.1 -p 8080`,
- Args: cobra.MatchAll(cobra.NoArgs),
+ Use: GetCmdUsageDeleteAppliance(),
+ Short: "Delete a memory appliance connection from cfm-service",
+ Long: `Deletes a netowrk connection from the cfm-service to an external memory appliance.`,
+ Example: GetCmdExampleDeleteAppliance(),
+ Args: cobra.MatchAll(cobra.NoArgs),
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
initLogging(cmd)
return nil
@@ -39,8 +37,37 @@ func init() {
initCommonPersistentFlags(deleteApplianceCmd)
- deleteApplianceCmd.Flags().StringP(flags.APPLIANCE_ID, flags.APPLIANCE_ID_SH, flags.ID_DFLT, "ID of memory appliance")
+ deleteApplianceCmd.Flags().StringP(flags.APPLIANCE_ID, flags.APPLIANCE_ID_SH, flags.ID_DFLT, "ID of memory appliance\n")
+ deleteApplianceCmd.MarkFlagRequired(flags.APPLIANCE_ID)
//Add command to parent
deleteCmd.AddCommand(deleteApplianceCmd)
}
+
+// GetCmdUsageDeleteAppliance - Generates the command usage string for the cobra.Command.Use field.
+func GetCmdUsageDeleteAppliance() string {
+ return fmt.Sprintf("%s %s %s",
+ flags.APPLIANCE, // Note: The first word in the Command.Use string is how Cobra defines the "name" of this "command".
+ flags.GetOptionUsageGroupServiceTcp(false),
+ flags.GetOptionUsageApplianceId(false))
+}
+
+// GetCmdExampleDeleteAppliance - Generates the command example string for the cobra.Command.Example field.
+func GetCmdExampleDeleteAppliance() string {
+ baseCmd := fmt.Sprintf("cfm delete %s", flags.APPLIANCE)
+
+ shorthandFormat := fmt.Sprintf("%s %s %s",
+ baseCmd,
+ flags.GetOptionExampleShGroupServiceTcp(),
+ flags.GetOptionExampleShApplianceId())
+
+ longhandFormat := fmt.Sprintf("%s %s %s",
+ baseCmd,
+ flags.GetOptionExampleLhGroupServiceTcp(),
+ flags.GetOptionExampleLhApplianceId())
+
+ return fmt.Sprintf(`
+ %s
+
+ %s`, shorthandFormat, longhandFormat)
+}
diff --git a/cmd/cfm-cli/cmd/deleteBlade.go b/cmd/cfm-cli/cmd/deleteBlade.go
index c236b3e..f40e79a 100644
--- a/cmd/cfm-cli/cmd/deleteBlade.go
+++ b/cmd/cfm-cli/cmd/deleteBlade.go
@@ -5,19 +5,17 @@ package cmd
import (
"cfm/cli/pkg/serviceLib/flags"
"cfm/cli/pkg/serviceLib/serviceRequests"
+ "fmt"
"github.com/spf13/cobra"
)
var deleteBladeCmd = &cobra.Command{
- Use: `blade [--serv-ip | -a] [--serv-net-port | -p] <--appliance-id | -L> <--blade-id | -B>`,
- Short: "Delete a memory appliance blade connection from cfm-service",
- Long: `Deletes a netowrk connection from the cfm-service to an external memory appliance blade.`,
- Example: `
- cfm delete blade --appliance-id applId --blade-id bladeId --serv-ip 127.0.0.1 --serv-net-port 8080
-
- cfm delete blade -L applId -B bladeId -a 127.0.0.1 -p 8080`,
- Args: cobra.MatchAll(cobra.NoArgs),
+ Use: GetCmdUsageDeleteBlade(),
+ Short: "Delete a memory appliance blade connection from cfm-service",
+ Long: `Deletes a netowrk connection from the cfm-service to an external memory appliance blade.`,
+ Example: GetCmdExampleDeleteBlade(),
+ Args: cobra.MatchAll(cobra.NoArgs),
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
initLogging(cmd)
return nil
@@ -39,9 +37,42 @@ func init() {
initCommonPersistentFlags(deleteBladeCmd)
- deleteBladeCmd.Flags().StringP(flags.APPLIANCE_ID, flags.APPLIANCE_ID_SH, flags.ID_DFLT, "ID of blade's appliance")
- deleteBladeCmd.Flags().StringP(flags.BLADE_ID, flags.BLADE_ID_SH, flags.ID_DFLT, "ID of blade to delete")
+ deleteBladeCmd.Flags().StringP(flags.APPLIANCE_ID, flags.APPLIANCE_ID_SH, flags.ID_DFLT, "ID of blade's appliance\n")
+ deleteBladeCmd.MarkFlagRequired(flags.APPLIANCE_ID)
+ deleteBladeCmd.Flags().StringP(flags.BLADE_ID, flags.BLADE_ID_SH, flags.ID_DFLT, "ID of blade to delete\n")
+ deleteBladeCmd.MarkFlagRequired(flags.BLADE_ID)
//Add command to parent
deleteCmd.AddCommand(deleteBladeCmd)
}
+
+// GetCmdUsageDeleteBlade - Generates the command usage string for the cobra.Command.Use field.
+func GetCmdUsageDeleteBlade() string {
+ return fmt.Sprintf("%s %s %s %s",
+ flags.BLADE, // Note: The first word in the Command.Use string is how Cobra defines the "name" of this "command".
+ flags.GetOptionUsageGroupServiceTcp(false),
+ flags.GetOptionUsageApplianceId(false),
+ flags.GetOptionUsageBladeId(false))
+}
+
+// GetCmdExampleDeleteBlade - Generates the command example string for the cobra.Command.Example field.
+func GetCmdExampleDeleteBlade() string {
+ baseCmd := fmt.Sprintf("cfm delete %s", flags.BLADE)
+
+ shorthandFormat := fmt.Sprintf("%s %s %s %s",
+ baseCmd,
+ flags.GetOptionExampleShGroupServiceTcp(),
+ flags.GetOptionExampleShApplianceId(),
+ flags.GetOptionExampleShBladeId())
+
+ longhandFormat := fmt.Sprintf("%s %s %s %s",
+ baseCmd,
+ flags.GetOptionExampleLhGroupServiceTcp(),
+ flags.GetOptionExampleLhApplianceId(),
+ flags.GetOptionExampleLhBladeId())
+
+ return fmt.Sprintf(`
+ %s
+
+ %s`, shorthandFormat, longhandFormat)
+}
diff --git a/cmd/cfm-cli/cmd/deleteHost.go b/cmd/cfm-cli/cmd/deleteHost.go
index 5af6039..5c519a6 100644
--- a/cmd/cfm-cli/cmd/deleteHost.go
+++ b/cmd/cfm-cli/cmd/deleteHost.go
@@ -5,19 +5,17 @@ package cmd
import (
"cfm/cli/pkg/serviceLib/flags"
"cfm/cli/pkg/serviceLib/serviceRequests"
+ "fmt"
"github.com/spf13/cobra"
)
var deleteHostCmd = &cobra.Command{
- Use: `host [--serv-ip | -i] [--serv-net-port | -p] <--host-id | -H>`,
- Short: `Delete a cxl host connection from cfm-service`,
- Long: `Deletes a netowrk connection from the cfm-service to an external cxl host.`,
- Example: `
- cfm delete host --host-id hostId --serv-ip 127.0.0.1 --serv-net-port 8080
-
- cfm delete host -H hostId -a 127.0.0.1 -p 8080`,
- Args: cobra.MatchAll(cobra.NoArgs),
+ Use: GetCmdUsageDeleteHost(),
+ Short: `Delete a cxl host connection from cfm-service`,
+ Long: `Deletes a netowrk connection from the cfm-service to an external cxl host.`,
+ Example: GetCmdExampleDeleteHost(),
+ Args: cobra.MatchAll(cobra.NoArgs),
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
initLogging(cmd)
return nil
@@ -39,8 +37,37 @@ func init() {
initCommonPersistentFlags(deleteHostCmd)
- deleteHostCmd.Flags().StringP(flags.HOST_ID, flags.HOST_ID_SH, flags.ID_DFLT, "ID of CXL host")
+ deleteHostCmd.Flags().StringP(flags.HOST_ID, flags.HOST_ID_SH, flags.ID_DFLT, "ID of CXL host\n")
+ deleteHostCmd.MarkFlagRequired(flags.HOST_ID)
//Add command to parent
deleteCmd.AddCommand(deleteHostCmd)
}
+
+// GetCmdUsageDeleteHost - Generates the command usage string for the cobra.Command.Use field.
+func GetCmdUsageDeleteHost() string {
+ return fmt.Sprintf("%s %s %s",
+ flags.HOST, // Note: The first word in the Command.Use string is how Cobra defines the "name" of this "command".
+ flags.GetOptionUsageGroupServiceTcp(false),
+ flags.GetOptionUsageHostId(false))
+}
+
+// GetCmdExampleDeleteHost - Generates the command example string for the cobra.Command.Example field.
+func GetCmdExampleDeleteHost() string {
+ baseCmd := fmt.Sprintf("cfm delete %s", flags.HOST)
+
+ shorthandFormat := fmt.Sprintf("%s %s %s",
+ baseCmd,
+ flags.GetOptionExampleShGroupServiceTcp(),
+ flags.GetOptionExampleShHostId())
+
+ longhandFormat := fmt.Sprintf("%s %s %s",
+ baseCmd,
+ flags.GetOptionExampleLhGroupServiceTcp(),
+ flags.GetOptionExampleLhHostId())
+
+ return fmt.Sprintf(`
+ %s
+
+ %s`, shorthandFormat, longhandFormat)
+}
diff --git a/cmd/cfm-cli/cmd/freeBlade.go b/cmd/cfm-cli/cmd/freeBlade.go
index d255fbf..2941405 100644
--- a/cmd/cfm-cli/cmd/freeBlade.go
+++ b/cmd/cfm-cli/cmd/freeBlade.go
@@ -11,14 +11,11 @@ import (
)
var freeBladeCmd = &cobra.Command{
- Use: "blade [--serv-ip | -a] [--serv-net-port | -p] <--appliance-id | -L> <--blade-id | -B> <--memory-id | -i>",
- Short: "Free an existing memory region on the specified memory appliance blade.",
- Long: `Free an existing memory region on the specified memory appliance blade. The blade port will be unassigned and the memory region's resource blocks will be deallocated.`,
- Example: `
- cfm free --serv-ip 127.0.0.1 --serv-net-port 8080 --appliance-id applId --blade-id bladeId --memory-id memoryId
-
- cfm free -a 127.0.0.1 -p 8080 -L applId -B bladeId -m memoryId`,
- Args: cobra.MatchAll(cobra.NoArgs),
+ Use: GetCmdUsageFreeBlade(),
+ Short: "Free an existing memory region on the specified memory appliance blade.",
+ Long: `Free an existing memory region on the specified memory appliance blade. The blade port (if present) will be unassigned and the memory region's resource blocks will be deallocated.`,
+ Example: GetCmdExampleFreeBlade(),
+ Args: cobra.MatchAll(cobra.NoArgs),
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("Free Memory...")
@@ -41,11 +38,11 @@ var freeBladeCmd = &cobra.Command{
func init() {
freeBladeCmd.DisableFlagsInUseLine = true
- freeBladeCmd.Flags().StringP(flags.APPLIANCE_ID, flags.APPLIANCE_ID_SH, flags.ID_DFLT, "ID of appliance to interrogate")
+ freeBladeCmd.Flags().StringP(flags.APPLIANCE_ID, flags.APPLIANCE_ID_SH, flags.ID_DFLT, "ID of appliance to interrogate\n")
freeBladeCmd.MarkFlagRequired(flags.APPLIANCE_ID)
- freeBladeCmd.Flags().StringP(flags.BLADE_ID, flags.BLADE_ID_SH, flags.ID_DFLT, "ID of appliance blade to interrogate")
+ freeBladeCmd.Flags().StringP(flags.BLADE_ID, flags.BLADE_ID_SH, flags.ID_DFLT, "ID of appliance blade to interrogate\n")
freeBladeCmd.MarkFlagRequired(flags.BLADE_ID)
- freeBladeCmd.Flags().StringP(flags.MEMORY_ID, flags.MEMORY_ID_SH, flags.ID_DFLT, "ID of a specific appliance blade memory region to free.")
+ freeBladeCmd.Flags().StringP(flags.MEMORY_ID, flags.MEMORY_ID_SH, flags.ID_DFLT, "ID of a specific appliance blade memory region to free\n")
freeBladeCmd.MarkFlagRequired(flags.MEMORY_ID)
initCommonPersistentFlags(freeBladeCmd)
@@ -53,3 +50,37 @@ func init() {
//Add command to parent
freeCmd.AddCommand(freeBladeCmd)
}
+
+// GetCmdUsageFreeBlade - Generates the command usage string for the cobra.Command.Use field.
+func GetCmdUsageFreeBlade() string {
+ return fmt.Sprintf("%s %s %s %s %s",
+ flags.BLADE, // Note: The first word in the Command.Use string is how Cobra defines the "name" of this "command".
+ flags.GetOptionUsageGroupServiceTcp(false),
+ flags.GetOptionUsageApplianceId(false),
+ flags.GetOptionUsageBladeId(false),
+ flags.GetOptionUsageMemoryId(false))
+}
+
+// GetCmdExampleFreeBlade - Generates the command example string for the cobra.Command.Example field.
+func GetCmdExampleFreeBlade() string {
+ baseCmd := fmt.Sprintf("cfm free %s", flags.BLADE)
+
+ shorthandFormat := fmt.Sprintf("%s %s %s %s %s",
+ baseCmd,
+ flags.GetOptionExampleShGroupServiceTcp(),
+ flags.GetOptionExampleShApplianceId(),
+ flags.GetOptionExampleShBladeId(),
+ flags.GetOptionExampleShMemoryId())
+
+ longhandFormat := fmt.Sprintf("%s %s %s %s %s",
+ baseCmd,
+ flags.GetOptionExampleLhGroupServiceTcp(),
+ flags.GetOptionExampleLhApplianceId(),
+ flags.GetOptionExampleLhBladeId(),
+ flags.GetOptionExampleLhMemoryId())
+
+ return fmt.Sprintf(`
+ %s
+
+ %s`, shorthandFormat, longhandFormat)
+}
diff --git a/cmd/cfm-cli/cmd/list.go b/cmd/cfm-cli/cmd/list.go
index a9f87d8..5fe0f89 100644
--- a/cmd/cfm-cli/cmd/list.go
+++ b/cmd/cfm-cli/cmd/list.go
@@ -31,8 +31,8 @@ func initCommonBladeListCmdFlags(cmd *cobra.Command) {
initCommonPersistentFlags(cmd)
- cmd.Flags().StringP(flags.APPLIANCE_ID, flags.APPLIANCE_ID_SH, flags.ID_DFLT, "ID of appliance to interrogate")
- cmd.Flags().StringP(flags.BLADE_ID, flags.BLADE_ID_SH, flags.ID_DFLT, "ID of blade to interrogate")
+ cmd.Flags().StringP(flags.APPLIANCE_ID, flags.APPLIANCE_ID_SH, flags.ID_DFLT, "ID of appliance to interrogate\n (default \"all appliances listed\")")
+ cmd.Flags().StringP(flags.BLADE_ID, flags.BLADE_ID_SH, flags.ID_DFLT, "ID of blade to interrogate\n (default \"all blades listed\")")
}
// Add set of flags used by all the "list" commands
@@ -42,5 +42,5 @@ func initCommonHostListCmdFlags(cmd *cobra.Command) {
initCommonPersistentFlags(cmd)
- cmd.Flags().StringP(flags.HOST_ID, flags.HOST_ID_SH, flags.ID_DFLT, "ID of appliance to interrogate")
+ cmd.Flags().StringP(flags.HOST_ID, flags.HOST_ID_SH, flags.ID_DFLT, "ID of appliance to interrogate\n (default \"all hosts listed\")")
}
diff --git a/cmd/cfm-cli/cmd/listAppliances.go b/cmd/cfm-cli/cmd/listAppliances.go
index 39ead6f..58e1b8a 100644
--- a/cmd/cfm-cli/cmd/listAppliances.go
+++ b/cmd/cfm-cli/cmd/listAppliances.go
@@ -3,20 +3,19 @@
package cmd
import (
+ "cfm/cli/pkg/serviceLib/flags"
"cfm/cli/pkg/serviceLib/serviceRequests"
+ "fmt"
"github.com/spf13/cobra"
)
var listAppliancesCmd = &cobra.Command{
- Use: `appliances [--serv-ip | -i] [--serv-net-port | -p]`,
- Short: "List all recognized memory appliance(s)",
- Long: `Queries the cfm-service for all recognized memory appliance(s) and outputs a summary to stdout.`,
- Example: `
- cfm list appliances --serv-ip 127.0.0.1 --serv-net-port 8080
-
- cfm list appliances -a 127.0.0.1 -p 8080`,
- Args: cobra.MatchAll(cobra.NoArgs),
+ Use: GetCmdUsageListAppliances(),
+ Short: "List all recognized memory appliance(s)",
+ Long: `Queries the cfm-service for all recognized memory appliance(s) and outputs a summary to stdout.`,
+ Example: GetCmdExampleListAppliances(),
+ Args: cobra.MatchAll(cobra.NoArgs),
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
initLogging(cmd)
return nil
@@ -42,3 +41,28 @@ func init() {
//Add command to parent
listCmd.AddCommand(listAppliancesCmd)
}
+
+// GetCmdUsageListAppliances - Generates the command usage string for the cobra.Command.Use field.
+func GetCmdUsageListAppliances() string {
+ return fmt.Sprintf("%s %s",
+ flags.APPLIANCES, // Note: The first word in the Command.Use string is how Cobra defines the "name" of this "command".
+ flags.GetOptionUsageGroupServiceTcp(false))
+}
+
+// GetCmdExampleListAppliances - Generates the command example string for the cobra.Command.Example field.
+func GetCmdExampleListAppliances() string {
+ baseCmd := fmt.Sprintf("cfm list %s", flags.APPLIANCES)
+
+ shorthandFormat := fmt.Sprintf("%s %s",
+ baseCmd,
+ flags.GetOptionExampleShGroupServiceTcp())
+
+ longhandFormat := fmt.Sprintf("%s %s",
+ baseCmd,
+ flags.GetOptionExampleLhGroupServiceTcp())
+
+ return fmt.Sprintf(`
+ %s
+
+ %s`, shorthandFormat, longhandFormat)
+}
diff --git a/cmd/cfm-cli/cmd/listBladeMemory.go b/cmd/cfm-cli/cmd/listBladeMemory.go
index 27920e7..192b57a 100644
--- a/cmd/cfm-cli/cmd/listBladeMemory.go
+++ b/cmd/cfm-cli/cmd/listBladeMemory.go
@@ -6,35 +6,21 @@ import (
"cfm/cli/pkg/serviceLib/flags"
"cfm/cli/pkg/serviceLib/serviceRequests"
"fmt"
+ "strings"
"github.com/spf13/cobra"
)
var listBladesMemoryCmd = &cobra.Command{
- Use: `memory [--serv-ip | -a] [--serv-net-port | -p] [--appliance-id | -L] [--blade-id | -B] [--memory-id | -m]`,
+ Use: GetCmdUsageListBladesMemory(),
Short: "List all available blade composed and\\or provisioned memory regions",
Long: `Queries the cfm-service for available composed\\provisioned memory regions.
Outputs a detailed summary of those memory regions to stdout.
- Note that, for any given item ID, if it is omitted, ALL items are collected\searched.`,
- Example: `
- cfm list blades memory --serv-ip 127.0.0.1 --serv-net-port 8080 --appliance-id applId --blade-id bladeId --memory-id memId
- cfm list blades memory --serv-ip 127.0.0.1 --serv-net-port 8080 --appliance-id applId --blade-id bladeId
- cfm list blades memory --serv-ip 127.0.0.1 --serv-net-port 8080 --appliance-id applId --memory-id memId
- cfm list blades memory --serv-ip 127.0.0.1 --serv-net-port 8080 --appliance-id applId
- cfm list blades memory --serv-ip 127.0.0.1 --serv-net-port 8080 --blade-id bladeId --memory-id memId
- cfm list blades memory --serv-ip 127.0.0.1 --serv-net-port 8080 --blade-id bladeId
- cfm list blades memory --serv-ip 127.0.0.1 --serv-net-port 8080 --memory-id memId
- cfm list blades memory --serv-ip 127.0.0.1 --serv-net-port 8080
-
- cfm list blades memory -a 127.0.0.1 -p 8080 -L applId -B bladeId -m memId
- cfm list blades memory -a 127.0.0.1 -p 8080 -L applId -B bladeId
- cfm list blades memory -a 127.0.0.1 -p 8080 -L applId -m memId
- cfm list blades memory -a 127.0.0.1 -p 8080 -L applId
- cfm list blades memory -a 127.0.0.1 -p 8080 -B bladeId -m memId
- cfm list blades memory -a 127.0.0.1 -p 8080 -B bladeId
- cfm list blades memory -a 127.0.0.1 -p 8080 -m memId
- cfm list blades memory -a 127.0.0.1 -p 8080 `,
- Args: cobra.MatchAll(cobra.NoArgs),
+ Note: For any given ID option:
+ If the option is included, ONLY THAT ID is searched.
+ If the option is omitted, ALL POSSIBLE IDs (within cfm-service) are searched.`,
+ Example: GetCmdExampleListBladesMemory(),
+ Args: cobra.MatchAll(cobra.NoArgs),
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
initLogging(cmd)
@@ -55,7 +41,7 @@ var listBladesMemoryCmd = &cobra.Command{
func init() {
listBladesMemoryCmd.DisableFlagsInUseLine = true
- listBladesMemoryCmd.Flags().StringP(flags.MEMORY_ID, flags.MEMORY_ID_SH, flags.ID_DFLT, "ID of a specific memory region. (default \"all memory regions returned\")")
+ listBladesMemoryCmd.Flags().StringP(flags.MEMORY_ID, flags.MEMORY_ID_SH, flags.ID_DFLT, "ID of a specific memory region\n (default \"all memory regions listed\")")
initCommonBladeListCmdFlags(listBladesMemoryCmd)
@@ -63,7 +49,82 @@ func init() {
listBladesCmd.AddCommand(listBladesMemoryCmd)
}
-func testHelp(cmd *cobra.Command, test []string) {
- fmt.Println("A new help line")
- fmt.Println("Another new help line")
+// GetCmdUsageListBladeMemory - Generates the command usage string for the cobra.Command.Use field.
+func GetCmdUsageListBladesMemory() string {
+ return fmt.Sprintf("%s %s %s %s %s",
+ flags.MEMORY, // Note: The first word in the Command.Use string is how Cobra defines the "name" of this "command".
+ flags.GetOptionUsageGroupServiceTcp(false),
+ flags.GetOptionUsageApplianceId(true),
+ flags.GetOptionUsageBladeId(true),
+ flags.GetOptionUsageMemoryId(true))
+}
+
+// GetCmdExampleListBladesMemory - Generates the command example string for the cobra.Command.Example field.
+func GetCmdExampleListBladesMemory() string {
+ baseCmd := fmt.Sprintf("cfm list %s %s", flags.BLADES, flags.MEMORY)
+
+ baseCmdLoopSh := fmt.Sprintf("%s %s",
+ baseCmd,
+ flags.GetOptionExampleShGroupServiceTcp())
+
+ shIdExamplesMap := map[string]string{
+ "applianceId": " " + flags.GetOptionExampleShApplianceId(),
+ "bladeId": " " + flags.GetOptionExampleShBladeId(),
+ "memoryId": " " + flags.GetOptionExampleShMemoryId(),
+ }
+
+ shExampleLines := make([]string, 0, 8)
+ for i := 0; i < 8; i++ {
+ s := baseCmdLoopSh
+ if i&1 != 0 {
+ s += shIdExamplesMap["applianceId"]
+ }
+ if i&2 != 0 {
+ s += shIdExamplesMap["bladeId"]
+ }
+ if i&4 != 0 {
+ s += shIdExamplesMap["memoryId"]
+ }
+ shExampleLines = append(shExampleLines, s)
+ }
+
+ var shorthandFormat strings.Builder
+ for _, line := range shExampleLines {
+ shorthandFormat.WriteString("\t" + line + "\n")
+ }
+
+ baseCmdLoopLh := fmt.Sprintf("%s %s",
+ baseCmd,
+ flags.GetOptionExampleLhGroupServiceTcp())
+
+ lhIdExamplesMap := map[string]string{
+ "applianceId": " " + flags.GetOptionExampleLhApplianceId(),
+ "bladeId": " " + flags.GetOptionExampleLhBladeId(),
+ "memoryId": " " + flags.GetOptionExampleLhMemoryId(),
+ }
+
+ lhExampleLines := make([]string, 0, 8)
+ for i := 0; i < 8; i++ {
+ s := baseCmdLoopLh
+ if i&1 != 0 {
+ s += lhIdExamplesMap["applianceId"]
+ }
+ if i&2 != 0 {
+ s += lhIdExamplesMap["bladeId"]
+ }
+ if i&4 != 0 {
+ s += lhIdExamplesMap["memoryId"]
+ }
+ lhExampleLines = append(lhExampleLines, s)
+ }
+
+ var longhandFormat strings.Builder
+ for _, line := range lhExampleLines {
+ longhandFormat.WriteString("\t" + line + "\n")
+ }
+
+ return fmt.Sprintf(`
+%s
+
+%s`, shorthandFormat.String(), longhandFormat.String())
}
diff --git a/cmd/cfm-cli/cmd/listBladePorts.go b/cmd/cfm-cli/cmd/listBladePorts.go
index 60ddf50..5636080 100644
--- a/cmd/cfm-cli/cmd/listBladePorts.go
+++ b/cmd/cfm-cli/cmd/listBladePorts.go
@@ -5,35 +5,22 @@ package cmd
import (
"cfm/cli/pkg/serviceLib/flags"
"cfm/cli/pkg/serviceLib/serviceRequests"
+ "fmt"
+ "strings"
"github.com/spf13/cobra"
)
var listBladesPortsCmd = &cobra.Command{
- Use: `ports [--serv-ip | -a] [--serv-net-port | -p] [--appliance-id | -L] [--blade-id | -B] [--port-id | -o]`,
+ Use: GetCmdUsageListBladesPorts(),
Short: "List all available blade ports",
Long: `Queries the cfm-service for available appliance blade ports.
Outputs a detailed summary of those ports to stdout.
- Note that, for any given item ID, if it is omitted, ALL items are collected\searched.`,
- Example: `
- cfm list blades ports --serv-ip 127.0.0.1 --serv-net-port 8080 --appliance-id applId --blade-id bladeId --port-id portId
- cfm list blades ports --serv-ip 127.0.0.1 --serv-net-port 8080 --appliance-id applId --blade-id bladeId
- cfm list blades ports --serv-ip 127.0.0.1 --serv-net-port 8080 --appliance-id applId --port-id portId
- cfm list blades ports --serv-ip 127.0.0.1 --serv-net-port 8080 --appliance-id applId
- cfm list blades ports --serv-ip 127.0.0.1 --serv-net-port 8080 --blade-id bladeId --port-id portId
- cfm list blades ports --serv-ip 127.0.0.1 --serv-net-port 8080 --blade-id bladeId
- cfm list blades ports --serv-ip 127.0.0.1 --serv-net-port 8080 --port-id portId
- cfm list blades ports --serv-ip 127.0.0.1 --serv-net-port 8080
-
- cfm list blades ports -a 127.0.0.1 -p 8080 -L applId -B bladeId -o portId
- cfm list blades ports -a 127.0.0.1 -p 8080 -L applId -B bladeId
- cfm list blades ports -a 127.0.0.1 -p 8080 -L applId -o portId
- cfm list blades ports -a 127.0.0.1 -p 8080 -L applId
- cfm list blades ports -a 127.0.0.1 -p 8080 -B bladeId -o portId
- cfm list blades ports -a 127.0.0.1 -p 8080 -B bladeId
- cfm list blades ports -a 127.0.0.1 -p 8080 -o portId
- cfm list blades ports -a 127.0.0.1 -p 8080 `,
- Args: cobra.MatchAll(cobra.NoArgs),
+ Note: For any given ID option:
+ If the option is included, ONLY THAT ID is searched.
+ If the option is omitted, ALL POSSIBLE IDs (within cfm-service) are searched.`,
+ Example: GetCmdExampleListBladesPorts(),
+ Args: cobra.MatchAll(cobra.NoArgs),
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
initLogging(cmd)
return nil
@@ -53,10 +40,90 @@ var listBladesPortsCmd = &cobra.Command{
func init() {
listBladesPortsCmd.DisableFlagsInUseLine = true
- listBladesPortsCmd.Flags().StringP(flags.PORT_ID, flags.PORT_ID_SH, flags.ID_DFLT, "ID of a specific port. (default \"all ports returned.\")")
+ listBladesPortsCmd.Flags().StringP(flags.PORT_ID, flags.PORT_ID_SH, flags.ID_DFLT, "ID of a specific port\n (default \"all ports listed.\")")
initCommonBladeListCmdFlags(listBladesPortsCmd)
//Add command to parent
listBladesCmd.AddCommand(listBladesPortsCmd)
}
+
+// GetCmdUsageListBladesPorts - Generates the command usage string for the cobra.Command.Use field.
+func GetCmdUsageListBladesPorts() string {
+ return fmt.Sprintf("%s %s %s %s %s",
+ flags.PORTS, // Note: The first word in the Command.Use string is how Cobra defines the "name" of this "command".
+ flags.GetOptionUsageGroupServiceTcp(false),
+ flags.GetOptionUsageApplianceId(true),
+ flags.GetOptionUsageBladeId(true),
+ flags.GetOptionUsagePortId(true))
+}
+
+// GetCmdExampleListBladesPorts - Generates the command example string for the cobra.Command.Example field.
+func GetCmdExampleListBladesPorts() string {
+ baseCmd := fmt.Sprintf("cfm list %s %s", flags.BLADES, flags.PORTS)
+
+ baseCmdLoopSh := fmt.Sprintf("%s %s",
+ baseCmd,
+ flags.GetOptionExampleShGroupServiceTcp())
+
+ shIdExamplesMap := map[string]string{
+ "applianceId": " " + flags.GetOptionExampleShApplianceId(),
+ "bladeId": " " + flags.GetOptionExampleShBladeId(),
+ "portId": " " + flags.GetOptionExampleShPortId(),
+ }
+
+ shExampleLines := make([]string, 0, 8)
+ for i := 0; i < 8; i++ {
+ s := baseCmdLoopSh
+ if i&1 != 0 {
+ s += shIdExamplesMap["applianceId"]
+ }
+ if i&2 != 0 {
+ s += shIdExamplesMap["bladeId"]
+ }
+ if i&4 != 0 {
+ s += shIdExamplesMap["portId"]
+ }
+ shExampleLines = append(shExampleLines, s)
+ }
+
+ var shorthandFormat strings.Builder
+ for _, line := range shExampleLines {
+ shorthandFormat.WriteString("\t" + line + "\n")
+ }
+
+ baseCmdLoopLh := fmt.Sprintf("%s %s",
+ baseCmd,
+ flags.GetOptionExampleLhGroupServiceTcp())
+
+ lhIdExamplesMap := map[string]string{
+ "applianceId": " " + flags.GetOptionExampleLhApplianceId(),
+ "bladeId": " " + flags.GetOptionExampleLhBladeId(),
+ "portId": " " + flags.GetOptionExampleLhPortId(),
+ }
+
+ lhExampleLines := make([]string, 0, 8)
+ for i := 0; i < 8; i++ {
+ s := baseCmdLoopLh
+ if i&1 != 0 {
+ s += lhIdExamplesMap["applianceId"]
+ }
+ if i&2 != 0 {
+ s += lhIdExamplesMap["bladeId"]
+ }
+ if i&4 != 0 {
+ s += lhIdExamplesMap["portId"]
+ }
+ lhExampleLines = append(lhExampleLines, s)
+ }
+
+ var longhandFormat strings.Builder
+ for _, line := range lhExampleLines {
+ longhandFormat.WriteString("\t" + line + "\n")
+ }
+
+ return fmt.Sprintf(`
+%s
+
+%s`, shorthandFormat.String(), longhandFormat.String())
+}
diff --git a/cmd/cfm-cli/cmd/listBladeResources.go b/cmd/cfm-cli/cmd/listBladeResources.go
index 0df414a..7eae392 100644
--- a/cmd/cfm-cli/cmd/listBladeResources.go
+++ b/cmd/cfm-cli/cmd/listBladeResources.go
@@ -5,35 +5,21 @@ package cmd
import (
"cfm/cli/pkg/serviceLib/flags"
"cfm/cli/pkg/serviceLib/serviceRequests"
+ "fmt"
+ "strings"
"github.com/spf13/cobra"
)
var listBladeResourcesCmd = &cobra.Command{
- Use: `resources [--serv-ip | -a] [--serv-net-port | -p] [--appliance-id | -L] [--blade-id | -B] [--resource-id | -i]`,
+ Use: GetCmdUsageListBladesResources(),
Short: "List all available blade memory resources",
Long: `Queries the cfm-service for existing memory resources.
Outputs a detailed summary (including composition state) of those resources to stdout.
- Note that, for any given item ID, if it is omitted, ALL items are collected\searched.`,
- Example: `
- cfm list blades resources --serv-ip 127.0.0.1 --serv-net-port 8080 --appliance-id applId --blade-id bladeId --resource-id resId
- cfm list blades resources --serv-ip 127.0.0.1 --serv-net-port 8080 --appliance-id applId --blade-id bladeId
- cfm list blades resources --serv-ip 127.0.0.1 --serv-net-port 8080 --appliance-id applId --resource-id resId
- cfm list blades resources --serv-ip 127.0.0.1 --serv-net-port 8080 --appliance-id applId
- cfm list blades resources --serv-ip 127.0.0.1 --serv-net-port 8080 --blade-id bladeId --resource-id resId
- cfm list blades resources --serv-ip 127.0.0.1 --serv-net-port 8080 --blade-id bladeId
- cfm list blades resources --serv-ip 127.0.0.1 --serv-net-port 8080 --resource-id resId
- cfm list blades resources --serv-ip 127.0.0.1 --serv-net-port 8080
-
- cfm list blades resources -a 127.0.0.1 -p 8080 -L applId -B bladeId -r resId
- cfm list blades resources -a 127.0.0.1 -p 8080 -L applId -B bladeId
- cfm list blades resources -a 127.0.0.1 -p 8080 -L applId -r resId
- cfm list blades resources -a 127.0.0.1 -p 8080 -L applId
- cfm list blades resources -a 127.0.0.1 -p 8080 -B bladeId -r resId
- cfm list blades resources -a 127.0.0.1 -p 8080 -B bladeId
- cfm list blades resources -a 127.0.0.1 -p 8080 -r resId
- cfm list blades resources -a 127.0.0.1 -p 8080 `,
- Args: cobra.MatchAll(cobra.NoArgs),
+ Note: For any given ID option:
+ If the option is included, ONLY THAT ID is searched.
+ If the option is omitted, ALL POSSIBLE IDs (within cfm-service) are searched.`,
+ Example: GetCmdExampleListBladesResources(),
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
initLogging(cmd)
return nil
@@ -53,10 +39,90 @@ var listBladeResourcesCmd = &cobra.Command{
func init() {
listBladeResourcesCmd.DisableFlagsInUseLine = true
- listBladeResourcesCmd.Flags().StringP(flags.RESOURCE_ID, flags.RESOURCE_ID_SH, flags.ID_DFLT, "ID of a specific resource block. (default \"all resource blocks returned\")")
+ listBladeResourcesCmd.Flags().StringP(flags.RESOURCE_ID, flags.RESOURCE_ID_SH, flags.ID_DFLT, "ID of a specific resource block\n (default \"all resource blocks listed\")")
initCommonBladeListCmdFlags(listBladeResourcesCmd)
//Add command to parent
listBladesCmd.AddCommand(listBladeResourcesCmd)
}
+
+// GetCmdUsageListBladeResources - Generates the command usage string for the cobra.Command.Use field.
+func GetCmdUsageListBladesResources() string {
+ return fmt.Sprintf("%s %s %s %s %s",
+ flags.RESOURCES, // Note: The first word in the Command.Use string is how Cobra defines the "name" of this "command".
+ flags.GetOptionUsageGroupServiceTcp(false),
+ flags.GetOptionUsageApplianceId(true),
+ flags.GetOptionUsageBladeId(true),
+ flags.GetOptionUsageResourceId(true))
+}
+
+// GetCmdExampleListBladesResources - Generates the command example string for the cobra.Command.Example field.
+func GetCmdExampleListBladesResources() string {
+ baseCmd := fmt.Sprintf("cfm list %s %s", flags.BLADES, flags.RESOURCES)
+
+ baseCmdLoopSh := fmt.Sprintf("%s %s",
+ baseCmd,
+ flags.GetOptionExampleShGroupServiceTcp())
+
+ shIdExamplesMap := map[string]string{
+ "applianceId": " " + flags.GetOptionExampleShApplianceId(),
+ "bladeId": " " + flags.GetOptionExampleShBladeId(),
+ "resourceId": " " + flags.GetOptionExampleShResourceId(),
+ }
+
+ shExampleLines := make([]string, 0, 8)
+ for i := 0; i < 8; i++ {
+ s := baseCmdLoopSh
+ if i&1 != 0 {
+ s += shIdExamplesMap["applianceId"]
+ }
+ if i&2 != 0 {
+ s += shIdExamplesMap["bladeId"]
+ }
+ if i&4 != 0 {
+ s += shIdExamplesMap["resourceId"]
+ }
+ shExampleLines = append(shExampleLines, s)
+ }
+
+ var shorthandFormat strings.Builder
+ for _, line := range shExampleLines {
+ shorthandFormat.WriteString("\t" + line + "\n")
+ }
+
+ baseCmdLoopLh := fmt.Sprintf("%s %s",
+ baseCmd,
+ flags.GetOptionExampleLhGroupServiceTcp())
+
+ lhIdExamplesMap := map[string]string{
+ "applianceId": " " + flags.GetOptionExampleLhApplianceId(),
+ "bladeId": " " + flags.GetOptionExampleLhBladeId(),
+ "resourceId": " " + flags.GetOptionExampleLhResourceId(),
+ }
+
+ lhExampleLines := make([]string, 0, 8)
+ for i := 0; i < 8; i++ {
+ s := baseCmdLoopLh
+ if i&1 != 0 {
+ s += lhIdExamplesMap["applianceId"]
+ }
+ if i&2 != 0 {
+ s += lhIdExamplesMap["bladeId"]
+ }
+ if i&4 != 0 {
+ s += lhIdExamplesMap["resourceId"]
+ }
+ lhExampleLines = append(lhExampleLines, s)
+ }
+
+ var longhandFormat strings.Builder
+ for _, line := range lhExampleLines {
+ longhandFormat.WriteString("\t" + line + "\n")
+ }
+
+ return fmt.Sprintf(`
+%s
+
+%s`, shorthandFormat.String(), longhandFormat.String())
+}
diff --git a/cmd/cfm-cli/cmd/listBlades.go b/cmd/cfm-cli/cmd/listBlades.go
index 322c9ee..f4ecb3d 100644
--- a/cmd/cfm-cli/cmd/listBlades.go
+++ b/cmd/cfm-cli/cmd/listBlades.go
@@ -5,25 +5,18 @@ package cmd
import (
"cfm/cli/pkg/serviceLib/flags"
"cfm/cli/pkg/serviceLib/serviceRequests"
+ "fmt"
+ "strings"
"github.com/spf13/cobra"
)
var listBladesCmd = &cobra.Command{
- Use: `blades [--serv-ip | -a] [--serv-net-port | -p] [--appliance-id | -L] [--blade-id | -B]`,
- Short: "List some or all recognized appliance blades",
- Long: `Queries the cfm-service for some or all recognized appliance blades and outputs a detailed summary of the discovered blades to stdout.`,
- Example: `
- cfm list blades --serv-ip 127.0.0.1 --serv-net-port 8080 --appliance-id applId --blade-id bladeId
- cfm list blades --serv-ip 127.0.0.1 --serv-net-port 8080 --appliance-id applId
- cfm list blades --serv-ip 127.0.0.1 --serv-net-port 8080 --blade-id bladeId
- cfm list blades --serv-ip 127.0.0.1 --serv-net-port 8080
-
- cfm list blades -a 127.0.0.1 -p 8080 -L applId -B bladeId
- cfm list blades -a 127.0.0.1 -p 8080 -L applId
- cfm list blades -a 127.0.0.1 -p 8080 -B bladeId
- cfm list blades -a 127.0.0.1 -p 8080`,
- Args: cobra.MatchAll(cobra.NoArgs),
+ Use: GetCmdUsageListBlades(),
+ Short: "List some or all recognized appliance blades",
+ Long: `Queries the cfm-service for some or all recognized appliance blades and outputs a detailed summary of the discovered blades to stdout.`,
+ Example: GetCmdExampleListBlades(),
+ Args: cobra.MatchAll(cobra.NoArgs),
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
initLogging(cmd)
return nil
@@ -43,10 +36,79 @@ var listBladesCmd = &cobra.Command{
func init() {
listBladesCmd.DisableFlagsInUseLine = true
- initCommonPersistentFlags(listBladesCmd)
- listBladesCmd.Flags().StringP(flags.APPLIANCE_ID, flags.APPLIANCE_ID_SH, flags.ID_DFLT, "ID of appliance to interrogate (default \"all appliances searched\")")
- listBladesCmd.Flags().StringP(flags.BLADE_ID, flags.BLADE_ID_SH, flags.ID_DFLT, "ID of a specific appliance blade. (default \"all blades returned\")")
+ initCommonBladeListCmdFlags(listBladesCmd)
//Add command to parent
listCmd.AddCommand(listBladesCmd)
}
+
+// GetCmdUsageListBlade - Generates the command usage string for the cobra.Command.Use field.
+func GetCmdUsageListBlades() string {
+ return fmt.Sprintf("%s %s %s %s",
+ flags.BLADES, // Note: The first word in the Command.Use string is how Cobra defines the "name" of this "command".
+ flags.GetOptionUsageGroupServiceTcp(false),
+ flags.GetOptionUsageApplianceId(true),
+ flags.GetOptionUsageBladeId(true))
+}
+
+// GetCmdExampleListBlades - Generates the command example string for the cobra.Command.Example field.
+func GetCmdExampleListBlades() string {
+ baseCmd := fmt.Sprintf("cfm list %s", flags.BLADES)
+
+ baseCmdLoopSh := fmt.Sprintf("%s %s",
+ baseCmd,
+ flags.GetOptionExampleShGroupServiceTcp())
+
+ shIdExamplesMap := map[string]string{
+ "applianceId": " " + flags.GetOptionExampleShApplianceId(),
+ "bladeId": " " + flags.GetOptionExampleShBladeId(),
+ }
+
+ shExampleLines := make([]string, 0, 4)
+ for i := 0; i < 4; i++ {
+ s := baseCmdLoopSh
+ if i&1 != 0 {
+ s += shIdExamplesMap["applianceId"]
+ }
+ if i&2 != 0 {
+ s += shIdExamplesMap["bladeId"]
+ }
+ shExampleLines = append(shExampleLines, s)
+ }
+
+ var shorthandFormat strings.Builder
+ for _, line := range shExampleLines {
+ shorthandFormat.WriteString("\t" + line + "\n")
+ }
+
+ baseCmdLoopLh := fmt.Sprintf("%s %s",
+ baseCmd,
+ flags.GetOptionExampleLhGroupServiceTcp())
+
+ lhIdExamplesMap := map[string]string{
+ "applianceId": " " + flags.GetOptionExampleLhApplianceId(),
+ "bladeId": " " + flags.GetOptionExampleLhBladeId(),
+ }
+
+ lhExampleLines := make([]string, 0, 4)
+ for i := 0; i < 4; i++ {
+ s := baseCmdLoopLh
+ if i&1 != 0 {
+ s += lhIdExamplesMap["applianceId"]
+ }
+ if i&2 != 0 {
+ s += lhIdExamplesMap["bladeId"]
+ }
+ lhExampleLines = append(lhExampleLines, s)
+ }
+
+ var longhandFormat strings.Builder
+ for _, line := range lhExampleLines {
+ longhandFormat.WriteString("\t" + line + "\n")
+ }
+
+ return fmt.Sprintf(`
+%s
+
+%s`, shorthandFormat.String(), longhandFormat.String())
+}
diff --git a/cmd/cfm-cli/cmd/listHostMemory.go b/cmd/cfm-cli/cmd/listHostMemory.go
index 396d75c..9ba6cca 100644
--- a/cmd/cfm-cli/cmd/listHostMemory.go
+++ b/cmd/cfm-cli/cmd/listHostMemory.go
@@ -5,27 +5,22 @@ package cmd
import (
"cfm/cli/pkg/serviceLib/flags"
"cfm/cli/pkg/serviceLib/serviceRequests"
+ "fmt"
+ "strings"
"github.com/spf13/cobra"
)
var listHostsMemoryCmd = &cobra.Command{
- Use: `memory [--serv-ip | -a] [--serv-net-port | -p] [--host-id | -H] [--memory-id | -m]`,
+ Use: GetCmdUsageListHostsMemory(),
Short: "List all available composed memory region(s) accessible to the host(s)",
Long: `Queries the cfm-service for composed memory region(s) accessible to the host(s).
Outputs a detailed summary of those memory regions to stdout.
- Note that, for any given item ID, if it is omitted, ALL items are collected\searched.`,
- Example: `
- cfm list hosts memory --serv-ip 127.0.0.1 --serv-net-port 8080 --host-id hostId --memory-id memId
- cfm list hosts memory --serv-ip 127.0.0.1 --serv-net-port 8080 --host-id hostId
- cfm list hosts memory --serv-ip 127.0.0.1 --serv-net-port 8080 --memory-id memId
- cfm list hosts memory --serv-ip 127.0.0.1 --serv-net-port 8080
-
- cfm list hosts memory -a 127.0.0.1 -p 8080 -B hostId -m memId
- cfm list hosts memory -a 127.0.0.1 -p 8080 -B hostId
- cfm list hosts memory -a 127.0.0.1 -p 8080 -m memId
- cfm list hosts memory -a 127.0.0.1 -p 8080 `,
- Args: cobra.MatchAll(cobra.NoArgs),
+ Note: For any given ID option:
+ If the option is included, ONLY THAT ID is searched.
+ If the option is omitted, ALL POSSIBLE IDs (within cfm-service) are searched.`,
+ Example: GetCmdExampleListHostsMemory(),
+ Args: cobra.MatchAll(cobra.NoArgs),
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
initLogging(cmd)
return nil
@@ -47,8 +42,79 @@ func init() {
initCommonHostListCmdFlags(listHostsMemoryCmd)
- listHostsMemoryCmd.Flags().StringP(flags.MEMORY_ID, flags.MEMORY_ID_SH, flags.ID_DFLT, "ID of a specific memory region. (default \"all memory regions returned\")")
+ listHostsMemoryCmd.Flags().StringP(flags.MEMORY_ID, flags.MEMORY_ID_SH, flags.ID_DFLT, "ID of a specific memory region\n (default \"all memory regions listed\")")
//Add command to parent
listHostsCmd.AddCommand(listHostsMemoryCmd)
}
+
+// GetCmdUsageListHostMemory - Generates the command usage string for the cobra.Command.Use field.
+func GetCmdUsageListHostsMemory() string {
+ return fmt.Sprintf("%s %s %s %s",
+ flags.MEMORY, // Note: The first word in the Command.Use string is how Cobra defines the "name" of this "command".
+ flags.GetOptionUsageGroupServiceTcp(false),
+ flags.GetOptionUsageHostId(true),
+ flags.GetOptionUsageMemoryId(true))
+}
+
+// GetCmdExampleListHostsMemory - Generates the command example string for the cobra.Command.Example field.
+func GetCmdExampleListHostsMemory() string {
+ baseCmd := fmt.Sprintf("cfm list %s %s", flags.HOSTS, flags.MEMORY)
+
+ baseCmdLoopSh := fmt.Sprintf("%s %s",
+ baseCmd,
+ flags.GetOptionExampleShGroupServiceTcp())
+
+ shIdExamplesMap := map[string]string{
+ "hostId": " " + flags.GetOptionExampleShHostId(),
+ "memoryId": " " + flags.GetOptionExampleShMemoryId(),
+ }
+
+ shExampleLines := make([]string, 0, 4)
+ for i := 0; i < 4; i++ {
+ s := baseCmdLoopSh
+ if i&1 != 0 {
+ s += shIdExamplesMap["hostId"]
+ }
+ if i&2 != 0 {
+ s += shIdExamplesMap["memoryId"]
+ }
+ shExampleLines = append(shExampleLines, s)
+ }
+
+ var shorthandFormat strings.Builder
+ for _, line := range shExampleLines {
+ shorthandFormat.WriteString("\t" + line + "\n")
+ }
+
+ baseCmdLoopLh := fmt.Sprintf("%s %s",
+ baseCmd,
+ flags.GetOptionExampleLhGroupServiceTcp())
+
+ lhIdExamplesMap := map[string]string{
+ "hostId": " " + flags.GetOptionExampleShHostId(),
+ "memoryId": " " + flags.GetOptionExampleLhMemoryId(),
+ }
+
+ lhExampleLines := make([]string, 0, 4)
+ for i := 0; i < 4; i++ {
+ s := baseCmdLoopLh
+ if i&1 != 0 {
+ s += shIdExamplesMap["hostId"]
+ }
+ if i&2 != 0 {
+ s += lhIdExamplesMap["memoryId"]
+ }
+ lhExampleLines = append(lhExampleLines, s)
+ }
+
+ var longhandFormat strings.Builder
+ for _, line := range lhExampleLines {
+ longhandFormat.WriteString("\t" + line + "\n")
+ }
+
+ return fmt.Sprintf(`
+%s
+
+%s`, shorthandFormat.String(), longhandFormat.String())
+}
diff --git a/cmd/cfm-cli/cmd/listHostMemoryDevices.go b/cmd/cfm-cli/cmd/listHostMemoryDevices.go
index a33932a..72d522a 100644
--- a/cmd/cfm-cli/cmd/listHostMemoryDevices.go
+++ b/cmd/cfm-cli/cmd/listHostMemoryDevices.go
@@ -5,27 +5,22 @@ package cmd
import (
"cfm/cli/pkg/serviceLib/flags"
"cfm/cli/pkg/serviceLib/serviceRequests"
+ "fmt"
+ "strings"
"github.com/spf13/cobra"
)
var listHostsMemoryDevicesCmd = &cobra.Command{
- Use: `memory-devices [--serv-ip | -a] [--serv-net-port | -p] [--host-id | -H] [--memory-device-id | -d]`,
+ Use: GetCmdUsageListHostsMemoryDevices(),
Short: "List all available logical memory device(s) accessible to the host(s)",
Long: `Queries the cfm-service for logical memory device(s) accessible to the host(s).
Outputs a detailed summary of those memory regions to stdout.
- Note that, for any given item ID, if it is omitted, ALL items are collected\searched.`,
- Example: `
- cfm list hosts memory-devices --serv-ip 127.0.0.1 --serv-net-port 8080 --host-id hostId --memory-device-id memdevId
- cfm list hosts memory-devices --serv-ip 127.0.0.1 --serv-net-port 8080 --host-id hostId
- cfm list hosts memory-devices --serv-ip 127.0.0.1 --serv-net-port 8080 --memory-device-id memdevId
- cfm list hosts memory-devices --serv-ip 127.0.0.1 --serv-net-port 8080
-
- cfm list hosts memory-devices -a 127.0.0.1 -p 8080 -B hostId -d memdevId
- cfm list hosts memory-devices -a 127.0.0.1 -p 8080 -B hostId
- cfm list hosts memory-devices -a 127.0.0.1 -p 8080 -d memdevId
- cfm list hosts memory-devices -a 127.0.0.1 -p 8080 `,
- Args: cobra.MatchAll(cobra.NoArgs),
+ Note: For any given ID option:
+ If the option is included, ONLY THAT ID is searched.
+ If the option is omitted, ALL POSSIBLE IDs (within cfm-service) are searched.`,
+ Example: GetCmdExampleListHostsMemoryDevices(),
+ Args: cobra.MatchAll(cobra.NoArgs),
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
initLogging(cmd)
return nil
@@ -47,8 +42,79 @@ func init() {
initCommonHostListCmdFlags(listHostsMemoryDevicesCmd)
- listHostsMemoryDevicesCmd.Flags().StringP(flags.MEMORY_DEVICE_ID, flags.MEMORY_DEVICE_ID_SH, flags.ID_DFLT, "ID of a specific memory device. (default \"all memory devices returned\")")
+ listHostsMemoryDevicesCmd.Flags().StringP(flags.MEMORY_DEVICE_ID, flags.MEMORY_DEVICE_ID_SH, flags.ID_DFLT, "ID of a specific memory device\n (default \"all memory devices listsed\")")
//Add command to parent
listHostsCmd.AddCommand(listHostsMemoryDevicesCmd)
}
+
+// GetCmdUsageListHostsMemoryDevices - Generates the command usage string for the cobra.Command.Use field.
+func GetCmdUsageListHostsMemoryDevices() string {
+ return fmt.Sprintf("%s %s %s %s",
+ flags.MEMORY_DEVICES, // Note: The first word in the Command.Use string is how Cobra defines the "name" of this "command".
+ flags.GetOptionUsageGroupServiceTcp(false),
+ flags.GetOptionUsageHostId(true),
+ flags.GetOptionUsageMemoryDeviceId(true))
+}
+
+// GetCmdExampleListHostsMemoryDevices - Generates the command example string for the cobra.Command.Example field.
+func GetCmdExampleListHostsMemoryDevices() string {
+ baseCmd := fmt.Sprintf("cfm list %s %s", flags.HOSTS, flags.MEMORY_DEVICES)
+
+ baseCmdLoopSh := fmt.Sprintf("%s %s",
+ baseCmd,
+ flags.GetOptionExampleShGroupServiceTcp())
+
+ shIdExamplesMap := map[string]string{
+ "hostId": " " + flags.GetOptionExampleShHostId(),
+ "memorydeviceId": " " + flags.GetOptionExampleShMemoryDeviceId(),
+ }
+
+ shExampleLines := make([]string, 0, 4)
+ for i := 0; i < 4; i++ {
+ s := baseCmdLoopSh
+ if i&1 != 0 {
+ s += shIdExamplesMap["hostId"]
+ }
+ if i&2 != 0 {
+ s += shIdExamplesMap["memorydeviceId"]
+ }
+ shExampleLines = append(shExampleLines, s)
+ }
+
+ var shorthandFormat strings.Builder
+ for _, line := range shExampleLines {
+ shorthandFormat.WriteString("\t" + line + "\n")
+ }
+
+ baseCmdLoopLh := fmt.Sprintf("%s %s",
+ baseCmd,
+ flags.GetOptionExampleLhGroupServiceTcp())
+
+ lhIdExamplesMap := map[string]string{
+ "hostId": " " + flags.GetOptionExampleLhHostId(),
+ "memorydeviceId": " " + flags.GetOptionExampleLhMemoryDeviceId(),
+ }
+
+ lhExampleLines := make([]string, 0, 4)
+ for i := 0; i < 4; i++ {
+ s := baseCmdLoopLh
+ if i&1 != 0 {
+ s += lhIdExamplesMap["hostId"]
+ }
+ if i&2 != 0 {
+ s += lhIdExamplesMap["memorydeviceId"]
+ }
+ lhExampleLines = append(lhExampleLines, s)
+ }
+
+ var longhandFormat strings.Builder
+ for _, line := range lhExampleLines {
+ longhandFormat.WriteString("\t" + line + "\n")
+ }
+
+ return fmt.Sprintf(`
+%s
+
+%s`, shorthandFormat.String(), longhandFormat.String())
+}
diff --git a/cmd/cfm-cli/cmd/listHostPorts.go b/cmd/cfm-cli/cmd/listHostPorts.go
index 497d3b3..09adeb8 100644
--- a/cmd/cfm-cli/cmd/listHostPorts.go
+++ b/cmd/cfm-cli/cmd/listHostPorts.go
@@ -5,27 +5,22 @@ package cmd
import (
"cfm/cli/pkg/serviceLib/flags"
"cfm/cli/pkg/serviceLib/serviceRequests"
+ "fmt"
+ "strings"
"github.com/spf13/cobra"
)
var listHostsPortsCmd = &cobra.Command{
- Use: `ports [--serv-ip | -a] [--serv-net-port | -p] [-host-id | -H] [--port-id | -o]`,
+ Use: GetCmdUsageListHostsPorts(),
Short: "List all available port(s) accessible to the host(s).",
Long: `Queries the cfm-service for port(s) accessible to the host(s).
Outputs a detailed summary of those ports to stdout.
- Note that, for any given item ID, if it is omitted, ALL items are collected\searched.`,
- Example: `
- cfm list hosts ports --serv-ip 127.0.0.1 --serv-net-port 8080 --host-id hostId --port-id portId
- cfm list hosts ports --serv-ip 127.0.0.1 --serv-net-port 8080 --host-id hostId
- cfm list hosts ports --serv-ip 127.0.0.1 --serv-net-port 8080 --port-id portId
- cfm list hosts ports --serv-ip 127.0.0.1 --serv-net-port 8080
-
- cfm list hosts ports -a 127.0.0.1 -p 8080 -B hostId -o portId
- cfm list hosts ports -a 127.0.0.1 -p 8080 -B hostId
- cfm list hosts ports -a 127.0.0.1 -p 8080 -o portId
- cfm list hosts ports -a 127.0.0.1 -p 8080 `,
- Args: cobra.MatchAll(cobra.NoArgs),
+ Note: For any given ID option:
+ If the option is included, ONLY THAT ID is searched.
+ If the option is omitted, ALL POSSIBLE IDs (within cfm-service) are searched.`,
+ Example: GetCmdExampleListHostsPorts(),
+ Args: cobra.MatchAll(cobra.NoArgs),
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
initLogging(cmd)
return nil
@@ -47,8 +42,79 @@ func init() {
initCommonHostListCmdFlags(listHostsPortsCmd)
- listHostsPortsCmd.Flags().StringP(flags.PORT_ID, flags.PORT_ID_SH, flags.ID_DFLT, "ID of a specific port. (default \"all ports returned.\")")
+ listHostsPortsCmd.Flags().StringP(flags.PORT_ID, flags.PORT_ID_SH, flags.ID_DFLT, "ID of a specific port\n (default \"all ports listed.\")")
//Add command to parent
listHostsCmd.AddCommand(listHostsPortsCmd)
}
+
+// GetCmdUsageListHostsPorts - Generates the command usage string for the cobra.Command.Use field.
+func GetCmdUsageListHostsPorts() string {
+ return fmt.Sprintf("%s %s %s %s",
+ flags.PORTS, // Note: The first word in the Command.Use string is how Cobra defines the "name" of this "command".
+ flags.GetOptionUsageGroupServiceTcp(false),
+ flags.GetOptionUsageHostId(true),
+ flags.GetOptionUsagePortId(true))
+}
+
+// GetCmdExampleListHostsPorts - Generates the command example string for the cobra.Command.Example field.
+func GetCmdExampleListHostsPorts() string {
+ baseCmd := fmt.Sprintf("cfm list %s %s", flags.HOSTS, flags.PORTS)
+
+ baseCmdLoopSh := fmt.Sprintf("%s %s",
+ baseCmd,
+ flags.GetOptionExampleShGroupServiceTcp())
+
+ shIdExamplesMap := map[string]string{
+ "hostId": " " + flags.GetOptionExampleShHostId(),
+ "portId": " " + flags.GetOptionExampleShPortId(),
+ }
+
+ shExampleLines := make([]string, 0, 4)
+ for i := 0; i < 4; i++ {
+ s := baseCmdLoopSh
+ if i&1 != 0 {
+ s += shIdExamplesMap["hostId"]
+ }
+ if i&2 != 0 {
+ s += shIdExamplesMap["portId"]
+ }
+ shExampleLines = append(shExampleLines, s)
+ }
+
+ var shorthandFormat strings.Builder
+ for _, line := range shExampleLines {
+ shorthandFormat.WriteString("\t" + line + "\n")
+ }
+
+ baseCmdLoopLh := fmt.Sprintf("%s %s",
+ baseCmd,
+ flags.GetOptionExampleLhGroupServiceTcp())
+
+ lhIdExamplesMap := map[string]string{
+ "hostId": " " + flags.GetOptionExampleLhHostId(),
+ "portId": " " + flags.GetOptionExampleLhPortId(),
+ }
+
+ lhExampleLines := make([]string, 0, 4)
+ for i := 0; i < 4; i++ {
+ s := baseCmdLoopLh
+ if i&1 != 0 {
+ s += lhIdExamplesMap["hostId"]
+ }
+ if i&2 != 0 {
+ s += lhIdExamplesMap["portId"]
+ }
+ lhExampleLines = append(lhExampleLines, s)
+ }
+
+ var longhandFormat strings.Builder
+ for _, line := range lhExampleLines {
+ longhandFormat.WriteString("\t" + line + "\n")
+ }
+
+ return fmt.Sprintf(`
+%s
+
+%s`, shorthandFormat.String(), longhandFormat.String())
+}
diff --git a/cmd/cfm-cli/cmd/listHosts.go b/cmd/cfm-cli/cmd/listHosts.go
index e71982f..52c5f22 100644
--- a/cmd/cfm-cli/cmd/listHosts.go
+++ b/cmd/cfm-cli/cmd/listHosts.go
@@ -3,21 +3,20 @@
package cmd
import (
+ "cfm/cli/pkg/serviceLib/flags"
"cfm/cli/pkg/serviceLib/serviceRequests"
+ "fmt"
"github.com/spf13/cobra"
)
// listHostsCmd represents the listHosts command
var listHostsCmd = &cobra.Command{
- Use: `hosts [--serv-ip | -i] [--serv-net-port | -p]`,
- Short: "List all recognized cxl host(s)",
- Long: `Queries the cfm-service for all recognized cxl host(s) and outputs a summary to stdout.`,
- Example: `
- cfm list hosts --serv-ip 127.0.0.1 --serv-net-port 8080
-
- cfm list hosts -a 127.0.0.1 -p 8080`,
- Args: cobra.MatchAll(cobra.NoArgs),
+ Use: GetCmdUsageListHosts(),
+ Short: "List all recognized cxl host(s)",
+ Long: `Queries the cfm-service for all recognized cxl host(s) and outputs a summary to stdout.`,
+ Example: GetCmdExampleListHosts(),
+ Args: cobra.MatchAll(cobra.NoArgs),
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
initLogging(cmd)
return nil
@@ -43,3 +42,28 @@ func init() {
//Add command to parent
listCmd.AddCommand(listHostsCmd)
}
+
+// GetCmdUsageListHost - Generates the command usage string for the cobra.Command.Use field.
+func GetCmdUsageListHosts() string {
+ return fmt.Sprintf("%s %s",
+ flags.HOSTS, // Note: The first word in the Command.Use string is how Cobra defines the "name" of this "command".
+ flags.GetOptionUsageGroupServiceTcp(false))
+}
+
+// GetCmdExampleListHosts - Generates the command example string for the cobra.Command.Example field.
+func GetCmdExampleListHosts() string {
+ baseCmd := fmt.Sprintf("cfm list %s", flags.HOSTS)
+
+ shorthandFormat := fmt.Sprintf("%s %s",
+ baseCmd,
+ flags.GetOptionExampleShGroupServiceTcp())
+
+ longhandFormat := fmt.Sprintf("%s %s",
+ baseCmd,
+ flags.GetOptionExampleLhGroupServiceTcp())
+
+ return fmt.Sprintf(`
+ %s
+
+ %s`, shorthandFormat, longhandFormat)
+}
diff --git a/cmd/cfm-cli/cmd/renameAppliance.go b/cmd/cfm-cli/cmd/renameAppliance.go
index 1936e92..fe67433 100644
--- a/cmd/cfm-cli/cmd/renameAppliance.go
+++ b/cmd/cfm-cli/cmd/renameAppliance.go
@@ -5,19 +5,17 @@ package cmd
import (
"cfm/cli/pkg/serviceLib/flags"
"cfm/cli/pkg/serviceLib/serviceRequests"
+ "fmt"
"github.com/spf13/cobra"
)
var renameApplianceCmd = &cobra.Command{
- Use: `appliance [--serv-ip | -a] [--serv-net-port | -p] <--appliance-id | -L> <--new-id | -N>`,
- Short: "Rename a specific composable memory appliance (CMA) to a new ID",
- Long: `Rename a specific composable memory appliance (CMA) to a new ID.`,
- Example: `
- cfm rename appliance --appliance-id applId --new-id newId --serv-ip 127.0.0.1 --serv-net-port 8080
-
- cfm rename appliance -L applId -N newId -a 127.0.0.1 -p 8080`,
- Args: cobra.MatchAll(cobra.NoArgs),
+ Use: GetCmdUsageRenameAppliance(),
+ Short: "Rename a specific composable memory appliance (CMA) to a new ID",
+ Long: `Rename a specific composable memory appliance (CMA) to a new ID.`,
+ Example: GetCmdExampleRenameAppliance(),
+ Args: cobra.MatchAll(cobra.NoArgs),
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
initLogging(cmd)
return nil
@@ -39,11 +37,42 @@ func init() {
initCommonPersistentFlags(renameApplianceCmd)
- renameApplianceCmd.Flags().StringP(flags.APPLIANCE_ID, flags.APPLIANCE_ID_SH, flags.ID_DFLT, "Current ID of composable memory appliance (CMA)")
+ renameApplianceCmd.Flags().StringP(flags.APPLIANCE_ID, flags.APPLIANCE_ID_SH, flags.ID_DFLT, "Current ID of composable memory appliance (CMA)\n")
renameApplianceCmd.MarkFlagRequired(flags.APPLIANCE_ID)
- renameApplianceCmd.Flags().StringP(flags.NEW_ID, flags.NEW_ID_SH, flags.ID_DFLT, "New ID of composable memory appliance (CMA)")
+ renameApplianceCmd.Flags().StringP(flags.NEW_ID, flags.NEW_ID_SH, flags.ID_DFLT, "New ID of composable memory appliance (CMA)\n")
renameApplianceCmd.MarkFlagRequired(flags.NEW_ID)
//Add command to parent
renameCmd.AddCommand(renameApplianceCmd)
}
+
+// GetCmdUsageRenameAppliance - Generates the command usage string for the cobra.Command.Use field.
+func GetCmdUsageRenameAppliance() string {
+ return fmt.Sprintf("%s %s %s %s",
+ flags.APPLIANCE, // Note: The first word in the Command.Use string is how Cobra defines the "name" of this "command".
+ flags.GetOptionUsageGroupServiceTcp(false),
+ flags.GetOptionUsageApplianceId(false),
+ flags.GetOptionUsageNewId(false))
+}
+
+// GetCmdExampleRenameAppliance - Generates the command example string for the cobra.Command.Example field.
+func GetCmdExampleRenameAppliance() string {
+ baseCmd := fmt.Sprintf("cfm rename %s", flags.APPLIANCE)
+
+ shorthandFormat := fmt.Sprintf("%s %s %s %s",
+ baseCmd,
+ flags.GetOptionExampleShGroupServiceTcp(),
+ flags.GetOptionExampleShApplianceId(),
+ flags.GetOptionExampleShNewId())
+
+ longhandFormat := fmt.Sprintf("%s %s %s %s",
+ baseCmd,
+ flags.GetOptionExampleLhGroupServiceTcp(),
+ flags.GetOptionExampleLhApplianceId(),
+ flags.GetOptionExampleLhNewId())
+
+ return fmt.Sprintf(`
+ %s
+
+ %s`, shorthandFormat, longhandFormat)
+}
diff --git a/cmd/cfm-cli/cmd/renameBlade.go b/cmd/cfm-cli/cmd/renameBlade.go
index 1403009..fd0b482 100644
--- a/cmd/cfm-cli/cmd/renameBlade.go
+++ b/cmd/cfm-cli/cmd/renameBlade.go
@@ -5,19 +5,17 @@ package cmd
import (
"cfm/cli/pkg/serviceLib/flags"
"cfm/cli/pkg/serviceLib/serviceRequests"
+ "fmt"
"github.com/spf13/cobra"
)
var renameBladeCmd = &cobra.Command{
- Use: `blade [--serv-ip | -a] [--serv-net-port | -p] <--appliance-id | -L> <--blade-id | -B> <--new-id | -N>`,
- Short: "Rename a single blade ID on a specific composable memory appliance (CMA) to a new ID",
- Long: `Rename a single blade ID on a specific composable memory appliance (CMA) to a new ID.`,
- Example: `
- cfm rename blade --appliance-id applId --blade-id bladeId --new-id newId --serv-ip 127.0.0.1 --serv-net-port 8080
-
- cfm rename blade -L applId -B bladeId -N newId -a 127.0.0.1 -p 8080`,
- Args: cobra.MatchAll(cobra.NoArgs),
+ Use: GetCmdUsageRenameBlade(),
+ Short: "Rename a single blade ID on a specific composable memory appliance (CMA) to a new ID",
+ Long: `Rename a single blade ID on a specific composable memory appliance (CMA) to a new ID.`,
+ Example: GetCmdExampleRenameBlade(),
+ Args: cobra.MatchAll(cobra.NoArgs),
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
initLogging(cmd)
return nil
@@ -39,13 +37,47 @@ func init() {
initCommonPersistentFlags(renameBladeCmd)
- renameBladeCmd.Flags().StringP(flags.APPLIANCE_ID, flags.APPLIANCE_ID_SH, flags.ID_DFLT, "ID of blade's composable memory appliance (CMA)")
+ renameBladeCmd.Flags().StringP(flags.APPLIANCE_ID, flags.APPLIANCE_ID_SH, flags.ID_DFLT, "ID of blade's composable memory appliance (CMA)\n")
renameBladeCmd.MarkFlagRequired(flags.APPLIANCE_ID)
- renameBladeCmd.Flags().StringP(flags.BLADE_ID, flags.BLADE_ID_SH, flags.ID_DFLT, "Current blade ID")
+ renameBladeCmd.Flags().StringP(flags.BLADE_ID, flags.BLADE_ID_SH, flags.ID_DFLT, "Current blade ID\n")
renameBladeCmd.MarkFlagRequired(flags.BLADE_ID)
- renameBladeCmd.Flags().StringP(flags.NEW_ID, flags.NEW_ID_SH, flags.ID_DFLT, "New blade ID")
+ renameBladeCmd.Flags().StringP(flags.NEW_ID, flags.NEW_ID_SH, flags.ID_DFLT, "New blade ID\n")
renameBladeCmd.MarkFlagRequired(flags.NEW_ID)
//Add command to parent
renameCmd.AddCommand(renameBladeCmd)
}
+
+// GetCmdUsageRenameBlade - Generates the command usage string for the cobra.Command.Use field.
+func GetCmdUsageRenameBlade() string {
+ return fmt.Sprintf("%s %s %s %s %s",
+ flags.BLADE, // Note: The first word in the Command.Use string is how Cobra defines the "name" of this "command".
+ flags.GetOptionUsageGroupServiceTcp(false),
+ flags.GetOptionUsageApplianceId(false),
+ flags.GetOptionUsageBladeId(false),
+ flags.GetOptionUsageNewId(false))
+}
+
+// GetCmdExampleRenameBlade - Generates the command example string for the cobra.Command.Example field.
+func GetCmdExampleRenameBlade() string {
+ baseCmd := fmt.Sprintf("cfm rename %s", flags.BLADE)
+
+ shorthandFormat := fmt.Sprintf("%s %s %s %s %s",
+ baseCmd,
+ flags.GetOptionExampleShGroupServiceTcp(),
+ flags.GetOptionExampleShApplianceId(),
+ flags.GetOptionExampleShBladeId(),
+ flags.GetOptionExampleShNewId())
+
+ longhandFormat := fmt.Sprintf("%s %s %s %s %s",
+ baseCmd,
+ flags.GetOptionExampleLhGroupServiceTcp(),
+ flags.GetOptionExampleLhApplianceId(),
+ flags.GetOptionExampleLhBladeId(),
+ flags.GetOptionExampleLhNewId())
+
+ return fmt.Sprintf(`
+ %s
+
+ %s`, shorthandFormat, longhandFormat)
+}
diff --git a/cmd/cfm-cli/cmd/renameHost.go b/cmd/cfm-cli/cmd/renameHost.go
index e826f76..cfcce31 100644
--- a/cmd/cfm-cli/cmd/renameHost.go
+++ b/cmd/cfm-cli/cmd/renameHost.go
@@ -5,19 +5,17 @@ package cmd
import (
"cfm/cli/pkg/serviceLib/flags"
"cfm/cli/pkg/serviceLib/serviceRequests"
+ "fmt"
"github.com/spf13/cobra"
)
var renameHostCmd = &cobra.Command{
- Use: `host [--serv-ip | -i] [--serv-net-port | -p] <--host-id | -H> <--new-id | -N>`,
- Short: `Rename a specific cxl host to a new ID`,
- Long: `Rename a specific cxl host to a new ID.`,
- Example: `
- cfm rename host --host-id hostId --new-id newId --serv-ip 127.0.0.1 --serv-net-port 8080
-
- cfm rename host -H hostId -N newId -a 127.0.0.1 -p 8080`,
- Args: cobra.MatchAll(cobra.NoArgs),
+ Use: GetCmdUsageRenameHost(),
+ Short: `Rename a specific cxl host to a new ID`,
+ Long: `Rename a specific cxl host to a new ID.`,
+ Example: GetCmdExampleRenameHost(),
+ Args: cobra.MatchAll(cobra.NoArgs),
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
initLogging(cmd)
return nil
@@ -39,11 +37,42 @@ func init() {
initCommonPersistentFlags(renameHostCmd)
- renameHostCmd.Flags().StringP(flags.HOST_ID, flags.HOST_ID_SH, flags.ID_DFLT, "Current CXL host ID")
+ renameHostCmd.Flags().StringP(flags.HOST_ID, flags.HOST_ID_SH, flags.ID_DFLT, "Current CXL host ID\n")
renameHostCmd.MarkFlagRequired(flags.HOST_ID)
- renameHostCmd.Flags().StringP(flags.NEW_ID, flags.NEW_ID_SH, flags.ID_DFLT, "New CXL host ID")
+ renameHostCmd.Flags().StringP(flags.NEW_ID, flags.NEW_ID_SH, flags.ID_DFLT, "New CXL host ID\n")
renameHostCmd.MarkFlagRequired(flags.NEW_ID)
//Add command to parent
renameCmd.AddCommand(renameHostCmd)
}
+
+// GetCmdUsageRenameHost - Generates the command usage string for the cobra.Command.Use field.
+func GetCmdUsageRenameHost() string {
+ return fmt.Sprintf("%s %s %s %s",
+ flags.HOST, // Note: The first word in the Command.Use string is how Cobra defines the "name" of this "command".
+ flags.GetOptionUsageGroupServiceTcp(false),
+ flags.GetOptionUsageHostId(false),
+ flags.GetOptionUsageNewId(false))
+}
+
+// GetCmdExampleRenameHost - Generates the command example string for the cobra.Command.Example field.
+func GetCmdExampleRenameHost() string {
+ baseCmd := fmt.Sprintf("cfm rename %s", flags.HOST)
+
+ shorthandFormat := fmt.Sprintf("%s %s %s %s",
+ baseCmd,
+ flags.GetOptionExampleShGroupServiceTcp(),
+ flags.GetOptionExampleShHostId(),
+ flags.GetOptionExampleShNewId())
+
+ longhandFormat := fmt.Sprintf("%s %s %s %s",
+ baseCmd,
+ flags.GetOptionExampleLhGroupServiceTcp(),
+ flags.GetOptionExampleLhHostId(),
+ flags.GetOptionExampleLhNewId())
+
+ return fmt.Sprintf(`
+ %s
+
+ %s`, shorthandFormat, longhandFormat)
+}
diff --git a/cmd/cfm-cli/cmd/resyncAppliance.go b/cmd/cfm-cli/cmd/resyncAppliance.go
index effe134..9242265 100644
--- a/cmd/cfm-cli/cmd/resyncAppliance.go
+++ b/cmd/cfm-cli/cmd/resyncAppliance.go
@@ -5,19 +5,17 @@ package cmd
import (
"cfm/cli/pkg/serviceLib/flags"
"cfm/cli/pkg/serviceLib/serviceRequests"
+ "fmt"
"github.com/spf13/cobra"
)
var resyncApplianceCmd = &cobra.Command{
- Use: `appliance [--serv-ip | -a] [--serv-net-port | -p] <--appliance-id | -L>`,
- Short: "Resynchronize the cfm service to all the added blades for a specific composable memory appliance (CMA)",
- Long: `Resynchronize the cfm service to all the added blades for a specific composable memory appliance (CMA).`,
- Example: `
- cfm resync appliance --appliance-id applId --serv-ip 127.0.0.1 --serv-net-port 8080
-
- cfm resync appliance -L applId -a 127.0.0.1 -p 8080`,
- Args: cobra.MatchAll(cobra.NoArgs),
+ Use: GetCmdUsageResyncAppliance(),
+ Short: "Resynchronize the cfm service to all the added blades for a specific composable memory appliance (CMA)",
+ Long: `Resynchronize the cfm service to all the added blades for a specific composable memory appliance (CMA).`,
+ Example: GetCmdExampleResyncAppliance(),
+ Args: cobra.MatchAll(cobra.NoArgs),
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
initLogging(cmd)
return nil
@@ -39,9 +37,37 @@ func init() {
initCommonPersistentFlags(resyncApplianceCmd)
- resyncApplianceCmd.Flags().StringP(flags.APPLIANCE_ID, flags.APPLIANCE_ID_SH, flags.ID_DFLT, "ID of composable memory appliance (CMA)")
+ resyncApplianceCmd.Flags().StringP(flags.APPLIANCE_ID, flags.APPLIANCE_ID_SH, flags.ID_DFLT, "ID of composable memory appliance (CMA)\n")
resyncApplianceCmd.MarkFlagRequired(flags.APPLIANCE_ID)
//Add command to parent
resyncCmd.AddCommand(resyncApplianceCmd)
}
+
+// GetCmdUsageResyncAppliance - Generates the command usage string for the cobra.Command.Use field.
+func GetCmdUsageResyncAppliance() string {
+ return fmt.Sprintf("%s %s %s",
+ flags.APPLIANCE, // Note: The first word in the Command.Use string is how Cobra defines the "name" of this "command".
+ flags.GetOptionUsageGroupServiceTcp(false),
+ flags.GetOptionUsageApplianceId(false))
+}
+
+// GetCmdExampleResyncAppliance - Generates the command example string for the cobra.Command.Example field.
+func GetCmdExampleResyncAppliance() string {
+ baseCmd := fmt.Sprintf("cfm resync %s", flags.APPLIANCE)
+
+ shorthandFormat := fmt.Sprintf("%s %s %s",
+ baseCmd,
+ flags.GetOptionExampleShGroupServiceTcp(),
+ flags.GetOptionExampleShApplianceId())
+
+ longhandFormat := fmt.Sprintf("%s %s %s",
+ baseCmd,
+ flags.GetOptionExampleLhGroupServiceTcp(),
+ flags.GetOptionExampleLhApplianceId())
+
+ return fmt.Sprintf(`
+ %s
+
+ %s`, shorthandFormat, longhandFormat)
+}
diff --git a/cmd/cfm-cli/cmd/resyncBlade.go b/cmd/cfm-cli/cmd/resyncBlade.go
index 3f55497..d46f800 100644
--- a/cmd/cfm-cli/cmd/resyncBlade.go
+++ b/cmd/cfm-cli/cmd/resyncBlade.go
@@ -5,19 +5,17 @@ package cmd
import (
"cfm/cli/pkg/serviceLib/flags"
"cfm/cli/pkg/serviceLib/serviceRequests"
+ "fmt"
"github.com/spf13/cobra"
)
var resyncBladeCmd = &cobra.Command{
- Use: `blade [--serv-ip | -a] [--serv-net-port | -p] <--appliance-id | -L> <--blade-id | -B>`,
- Short: "Resynchronize the cfm service to a single blade on a specific composable memory appliance (CMA)",
- Long: `Resynchronize the cfm service to a single blade on a specific composable memory appliance (CMA).`,
- Example: `
- cfm resync blade --appliance-id applId --blade-id bladeId --serv-ip 127.0.0.1 --serv-net-port 8080
-
- cfm resync blade -L applId -B bladeId -a 127.0.0.1 -p 8080`,
- Args: cobra.MatchAll(cobra.NoArgs),
+ Use: GetCmdUsageResyncBlade(),
+ Short: "Resynchronize the cfm service to a single blade on a specific composable memory appliance (CMA)",
+ Long: `Resynchronize the cfm service to a single blade on a specific composable memory appliance (CMA).`,
+ Example: GetCmdExampleResyncBlade(),
+ Args: cobra.MatchAll(cobra.NoArgs),
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
initLogging(cmd)
return nil
@@ -39,11 +37,42 @@ func init() {
initCommonPersistentFlags(resyncBladeCmd)
- resyncBladeCmd.Flags().StringP(flags.APPLIANCE_ID, flags.APPLIANCE_ID_SH, flags.ID_DFLT, "ID of blade's appliance")
+ resyncBladeCmd.Flags().StringP(flags.APPLIANCE_ID, flags.APPLIANCE_ID_SH, flags.ID_DFLT, "ID of blade's appliance\n")
resyncBladeCmd.MarkFlagRequired(flags.APPLIANCE_ID)
- resyncBladeCmd.Flags().StringP(flags.BLADE_ID, flags.BLADE_ID_SH, flags.ID_DFLT, "ID of blade")
+ resyncBladeCmd.Flags().StringP(flags.BLADE_ID, flags.BLADE_ID_SH, flags.ID_DFLT, "ID of blade\n")
resyncBladeCmd.MarkFlagRequired(flags.BLADE_ID)
//Add command to parent
resyncCmd.AddCommand(resyncBladeCmd)
}
+
+// GetCmdUsageResyncBlade - Generates the command usage string for the cobra.Command.Use field.
+func GetCmdUsageResyncBlade() string {
+ return fmt.Sprintf("%s %s %s %s",
+ flags.BLADE, // Note: The first word in the Command.Use string is how Cobra defines the "name" of this "command".
+ flags.GetOptionUsageGroupServiceTcp(false),
+ flags.GetOptionUsageApplianceId(false),
+ flags.GetOptionUsageBladeId(false))
+}
+
+// GetCmdExampleResyncBlade - Generates the command example string for the cobra.Command.Example field.
+func GetCmdExampleResyncBlade() string {
+ baseCmd := fmt.Sprintf("cfm resync %s", flags.BLADE)
+
+ shorthandFormat := fmt.Sprintf("%s %s %s %s",
+ baseCmd,
+ flags.GetOptionExampleShGroupServiceTcp(),
+ flags.GetOptionExampleShApplianceId(),
+ flags.GetOptionExampleShBladeId())
+
+ longhandFormat := fmt.Sprintf("%s %s %s %s",
+ baseCmd,
+ flags.GetOptionExampleLhGroupServiceTcp(),
+ flags.GetOptionExampleLhApplianceId(),
+ flags.GetOptionExampleLhBladeId())
+
+ return fmt.Sprintf(`
+ %s
+
+ %s`, shorthandFormat, longhandFormat)
+}
diff --git a/cmd/cfm-cli/cmd/resyncHost.go b/cmd/cfm-cli/cmd/resyncHost.go
index f39f461..ca4d581 100644
--- a/cmd/cfm-cli/cmd/resyncHost.go
+++ b/cmd/cfm-cli/cmd/resyncHost.go
@@ -5,19 +5,17 @@ package cmd
import (
"cfm/cli/pkg/serviceLib/flags"
"cfm/cli/pkg/serviceLib/serviceRequests"
+ "fmt"
"github.com/spf13/cobra"
)
var resyncHostCmd = &cobra.Command{
- Use: `host [--serv-ip | -i] [--serv-net-port | -p] <--host-id | -H>`,
- Short: `Resynchronize the cfm service to a single cxl host`,
- Long: `Resynchronize the cfm service to a single cxl host.`,
- Example: `
- cfm resync host --host-id hostId --serv-ip 127.0.0.1 --serv-net-port 8080
-
- cfm resync host -H hostId -a 127.0.0.1 -p 8080`,
- Args: cobra.MatchAll(cobra.NoArgs),
+ Use: GetCmdUsageResyncHost(),
+ Short: `Resynchronize the cfm service to a single cxl host`,
+ Long: `Resynchronize the cfm service to a single cxl host.`,
+ Example: GetCmdExampleResyncHost(),
+ Args: cobra.MatchAll(cobra.NoArgs),
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
initLogging(cmd)
return nil
@@ -39,9 +37,37 @@ func init() {
initCommonPersistentFlags(resyncHostCmd)
- resyncHostCmd.Flags().StringP(flags.HOST_ID, flags.HOST_ID_SH, flags.ID_DFLT, "ID of CXL host")
+ resyncHostCmd.Flags().StringP(flags.HOST_ID, flags.HOST_ID_SH, flags.ID_DFLT, "ID of CXL host\n")
resyncHostCmd.MarkFlagRequired(flags.HOST_ID)
//Add command to parent
resyncCmd.AddCommand(resyncHostCmd)
}
+
+// GetCmdUsageResyncHost - Generates the command usage string for the cobra.Command.Use field.
+func GetCmdUsageResyncHost() string {
+ return fmt.Sprintf("%s %s %s",
+ flags.HOST, // Note: The first word in the Command.Use string is how Cobra defines the "name" of this "command".
+ flags.GetOptionUsageGroupServiceTcp(false),
+ flags.GetOptionUsageHostId(false))
+}
+
+// GetCmdExampleResyncHost - Generates the command example string for the cobra.Command.Example field.
+func GetCmdExampleResyncHost() string {
+ baseCmd := fmt.Sprintf("cfm resync %s", flags.HOST)
+
+ shorthandFormat := fmt.Sprintf("%s %s %s",
+ baseCmd,
+ flags.GetOptionExampleShGroupServiceTcp(),
+ flags.GetOptionExampleShHostId())
+
+ longhandFormat := fmt.Sprintf("%s %s %s",
+ baseCmd,
+ flags.GetOptionExampleLhGroupServiceTcp(),
+ flags.GetOptionExampleLhHostId())
+
+ return fmt.Sprintf(`
+ %s
+
+ %s`, shorthandFormat, longhandFormat)
+}
diff --git a/cmd/cfm-cli/cmd/root.go b/cmd/cfm-cli/cmd/root.go
index 5624b4b..87d226e 100644
--- a/cmd/cfm-cli/cmd/root.go
+++ b/cmd/cfm-cli/cmd/root.go
@@ -67,12 +67,8 @@ func initLogging(cmd *cobra.Command) {
// Need to ONLY add them in the subcommand init() func so these flags ONLY show up in the help output when they can actually be used.
func initCommonPersistentFlags(cmd *cobra.Command) {
//Add globally required cfm-service TCPIP connection flags
- cmd.PersistentFlags().StringP(flags.SERVICE_NET_IP, flags.SERVICE_NET_IP_SH, flags.SERVICE_NET_IP_DFLT, "cfm-service network IP address")
- cmd.PersistentFlags().Uint16P(flags.SERVICE_NET_PORT, flags.SERVICE_NET_PORT_SH, flags.SERVICE_NET_PORT_DFLT, "cfm-service network port")
-
- //Currently unused but need default values downstream
- cmd.PersistentFlags().Bool(flags.SERVICE_INSECURE, flags.SERVICE_INSECURE_DFLT, "cfm-service insecure connection flag")
- cmd.PersistentFlags().MarkHidden(flags.SERVICE_INSECURE)
- cmd.PersistentFlags().String(flags.SERVICE_PROTOCOL, flags.SERVICE_PROTOCOL_DFLT, "cfm-service network connection protocol (http/https)")
- cmd.PersistentFlags().MarkHidden(flags.SERVICE_PROTOCOL)
+ cmd.PersistentFlags().StringP(flags.SERVICE_NET_IP, flags.SERVICE_NET_IP_SH, flags.SERVICE_NET_IP_DFLT, "cfm-service network IP address\n")
+ cmd.PersistentFlags().Uint16P(flags.SERVICE_NET_PORT, flags.SERVICE_NET_PORT_SH, flags.SERVICE_NET_PORT_DFLT, "cfm-service network port\n")
+ cmd.PersistentFlags().BoolP(flags.SERVICE_INSECURE, flags.SERVICE_INSECURE_SH, flags.SERVICE_INSECURE_DFLT, "cfm-service insecure connection flag\n (default false)")
+ cmd.PersistentFlags().StringP(flags.SERVICE_PROTOCOL, flags.SERVICE_PROTOCOL_SH, flags.SERVICE_PROTOCOL_DFLT, "cfm-service network connection protocol (http/https)\n")
}
diff --git a/cmd/cfm-cli/cmd/unassignBlade.go b/cmd/cfm-cli/cmd/unassignBlade.go
index bed75a6..3e176ae 100644
--- a/cmd/cfm-cli/cmd/unassignBlade.go
+++ b/cmd/cfm-cli/cmd/unassignBlade.go
@@ -11,14 +11,11 @@ import (
)
var unassignBladeCmd = &cobra.Command{
- Use: "blade [--serv-ip | -a] [--serv-net-port | -p] <--appliance-id | -L> <--blade-id | -B> <--memory-id | -m> <--port-id | -o>",
- Short: "Unassign an existing blade memory region from a blade port.",
- Long: `Unassign an existing blade memory region from a blade port.`,
- Example: `
- cfm unassign blade --serv-ip 127.0.0.1 --serv-net-port 8080 --appliance-id applId --blade-id bladeId --memory-id memoryId --port-id portId
-
- cfm unassign blade -a 127.0.0.1 -p 8080 -L applId -B bladeId -m memoryId -o portId`,
- Args: cobra.MatchAll(cobra.NoArgs),
+ Use: GetCmdUsageUnassignBlade(),
+ Short: "Unassign an existing blade memory region from a blade port.",
+ Long: `Unassign an existing blade memory region from a blade port.`,
+ Example: GetCmdExampleUnassignBlade(),
+ Args: cobra.MatchAll(cobra.NoArgs),
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
initLogging(cmd)
return nil
@@ -44,13 +41,13 @@ var unassignBladeCmd = &cobra.Command{
func init() {
unassignBladeCmd.DisableFlagsInUseLine = true
- unassignBladeCmd.Flags().StringP(flags.APPLIANCE_ID, flags.APPLIANCE_ID_SH, flags.ID_DFLT, "ID of appliance to interrogate")
+ unassignBladeCmd.Flags().StringP(flags.APPLIANCE_ID, flags.APPLIANCE_ID_SH, flags.ID_DFLT, "ID of appliance to interrogate\n")
unassignBladeCmd.MarkFlagRequired(flags.APPLIANCE_ID)
- unassignBladeCmd.Flags().StringP(flags.BLADE_ID, flags.BLADE_ID_SH, flags.ID_DFLT, "ID of appliance blade to interrogate")
+ unassignBladeCmd.Flags().StringP(flags.BLADE_ID, flags.BLADE_ID_SH, flags.ID_DFLT, "ID of appliance blade to interrogate\n")
unassignBladeCmd.MarkFlagRequired(flags.BLADE_ID)
- unassignBladeCmd.Flags().StringP(flags.MEMORY_ID, flags.MEMORY_ID_SH, flags.ID_DFLT, "ID of the appliance blade memory region to unassign from the specified port.")
+ unassignBladeCmd.Flags().StringP(flags.MEMORY_ID, flags.MEMORY_ID_SH, flags.ID_DFLT, "ID of the appliance blade memory region to unassign from the specified port\n")
unassignBladeCmd.MarkFlagRequired(flags.MEMORY_ID)
- unassignBladeCmd.Flags().StringP(flags.PORT_ID, flags.PORT_ID_SH, flags.ID_DFLT, "ID of the appliance blade port to unassign from the specified memory region.")
+ unassignBladeCmd.Flags().StringP(flags.PORT_ID, flags.PORT_ID_SH, flags.ID_DFLT, "ID of the appliance blade port to unassign from the specified memory region\n")
unassignBladeCmd.MarkFlagRequired(flags.PORT_ID)
initCommonPersistentFlags(unassignBladeCmd)
@@ -58,3 +55,40 @@ func init() {
//Add command to parent
unassignCmd.AddCommand(unassignBladeCmd)
}
+
+// GetCmdUsageUnassignBlade - Generates the command usage string for the cobra.Command.Use field.
+func GetCmdUsageUnassignBlade() string {
+ return fmt.Sprintf("%s %s %s %s %s %s",
+ flags.BLADE, // Note: The first word in the Command.Use string is how Cobra defines the "name" of this "command".
+ flags.GetOptionUsageGroupServiceTcp(false),
+ flags.GetOptionUsageApplianceId(false),
+ flags.GetOptionUsageBladeId(false),
+ flags.GetOptionUsageMemoryId(false),
+ flags.GetOptionUsagePortId(false))
+}
+
+// GetCmdExampleUnassignBlade - Generates the command example string for the cobra.Command.Example field.
+func GetCmdExampleUnassignBlade() string {
+ baseCmd := fmt.Sprintf("cfm unassign %s", flags.BLADE)
+
+ shorthandFormat := fmt.Sprintf("%s %s %s %s %s %s",
+ baseCmd,
+ flags.GetOptionExampleShGroupServiceTcp(),
+ flags.GetOptionExampleShApplianceId(),
+ flags.GetOptionExampleShBladeId(),
+ flags.GetOptionExampleShMemoryId(),
+ flags.GetOptionExampleShPortId())
+
+ longhandFormat := fmt.Sprintf("%s %s %s %s %s %s",
+ baseCmd,
+ flags.GetOptionExampleLhGroupServiceTcp(),
+ flags.GetOptionExampleLhApplianceId(),
+ flags.GetOptionExampleLhBladeId(),
+ flags.GetOptionExampleLhMemoryId(),
+ flags.GetOptionExampleLhPortId())
+
+ return fmt.Sprintf(`
+ %s
+
+ %s`, shorthandFormat, longhandFormat)
+}
diff --git a/cmd/cfm-service/main.go b/cmd/cfm-service/main.go
index ef7f5b1..7a3502a 100644
--- a/cmd/cfm-service/main.go
+++ b/cmd/cfm-service/main.go
@@ -69,10 +69,12 @@ func main() {
api.AddRedfishRouter(ctx, router, defaultRedfishController)
// Discover devices before loading datastore
- bladeDevices, _ := services.DiscoverDevices(ctx, defaultApiService, "blade")
- hostDevices, _ := services.DiscoverDevices(ctx, defaultApiService, "cxl-host")
+ bladeDevices, errBlade := services.DiscoverDevices(ctx, defaultApiService, "blade")
+ hostDevices, errHost := services.DiscoverDevices(ctx, defaultApiService, "cxl-host")
// Add the discovered devices into datastore
- services.AddDiscoveredDevices(ctx, defaultApiService, bladeDevices, hostDevices)
+ if errBlade == nil && errHost == nil {
+ services.AddDiscoveredDevices(ctx, defaultApiService, bladeDevices, hostDevices)
+ }
// Load datastore
datastore.DStore().Restore()
diff --git a/docs/DOCKER.md b/docs/DOCKER.md
index 3ada062..75816a0 100644
--- a/docs/DOCKER.md
+++ b/docs/DOCKER.md
@@ -17,7 +17,7 @@ If desired, the user can add `:vX.X.X` to the end of the command to obtain an ol
To enable the webui launching during cfm-service startup, the user must provide the `-webui` flag in the command below.
```bash
-docker run --restart unless-stopped --network=host --name --detach ghcr.io/seagate/cfm -webui -verbosity 4
+docker run --restart unless-stopped --network=host --name --detach --privileged -v /var/run/dbus/system_bus_socket:/var/run/dbus/system_bus_socket ghcr.io/seagate/cfm -webui -verbosity 4
```
By default, the cfm-service will be hosted at port 8080 and the webui will be hosted at port 3000. The user could change the port by input argument -Port and/or -webuiPort. The webui only works with --network=host mode.
@@ -51,6 +51,9 @@ docker exec -it cfm-container ./cfm-cli -h
docker exec -it cfm-container ./cfm-cli list appliances
```
+NOTE: Currently, every cfm-cli command requires various tcpip options (e.g.: --service-net-ip) regarding the specific cfm-service that is being interacted with.
+However, using the docker container, the user can rely on the default cli settings for these cfm-service options since they point to the cfm-service running within the same docker container.
+
## Customization
The developer could use the [DockerFile](../docker/Dockerfile) as a reference to build a new docker image using a local [cfm](https://github.com/Seagate/cfm) clone...
@@ -63,5 +66,5 @@ docker build --no-cache -t -f docker/Dockerfile .
...and then run those changes
```bash
-docker run --restart unless-stopped --network=host --name --detach -webui -verbosity 4
+docker run --restart unless-stopped --network=host --name --detach --privileged -v /var/run/dbus/system_bus_socket:/var/run/dbus/system_bus_socket -webui -verbosity 4
```
diff --git a/pkg/api/api_default_service.go b/pkg/api/api_default_service.go
index 1fd2bfd..b704999 100644
--- a/pkg/api/api_default_service.go
+++ b/pkg/api/api_default_service.go
@@ -1498,7 +1498,7 @@ func (cfm *CfmApiService) RootGet(ctx context.Context) (openapi.ImplResponse, er
func (cfm *CfmApiService) DiscoverDevices(ctx context.Context, deviceType string) (openapi.ImplResponse, error) {
if deviceType != "blade" && deviceType != "cxl-host" {
err := common.RequestError{
- StatusCode: http.StatusBadRequest,
+ StatusCode: common.StatusDeviceDiscoveryFailure,
Err: fmt.Errorf("invalid type parameter"),
}
return formatErrorResp(ctx, &err)
@@ -1513,7 +1513,7 @@ func (cfm *CfmApiService) DiscoverDevices(ctx context.Context, deviceType string
conn, err := dbus.SystemBus()
if err != nil {
return formatErrorResp(ctx, &common.RequestError{
- StatusCode: http.StatusInternalServerError,
+ StatusCode: common.StatusDeviceDiscoveryFailure,
Err: fmt.Errorf("cannot get system bus: %v", err),
})
}
@@ -1521,7 +1521,7 @@ func (cfm *CfmApiService) DiscoverDevices(ctx context.Context, deviceType string
server, err := avahi.ServerNew(conn)
if err != nil {
return formatErrorResp(ctx, &common.RequestError{
- StatusCode: http.StatusInternalServerError,
+ StatusCode: common.StatusDeviceDiscoveryFailure,
Err: fmt.Errorf("avahi new failed: %v", err),
})
}
@@ -1530,7 +1530,7 @@ func (cfm *CfmApiService) DiscoverDevices(ctx context.Context, deviceType string
sb, err := server.ServiceBrowserNew(avahi.InterfaceUnspec, avahi.ProtoInet, "_obmc_redfish._tcp", "local", 0)
if err != nil {
return formatErrorResp(ctx, &common.RequestError{
- StatusCode: http.StatusInternalServerError,
+ StatusCode: common.StatusDeviceDiscoveryFailure,
Err: fmt.Errorf("service browser new failed: %v", err),
})
}
diff --git a/pkg/common/status.go b/pkg/common/status.go
index 3f067e6..3e3a600 100644
--- a/pkg/common/status.go
+++ b/pkg/common/status.go
@@ -76,6 +76,7 @@ const (
StatusBladeDeleteSessionFailure //500
StatusHostCreateSessionFailure //500
StatusHostDeleteSessionFailure //500
+ StatusDeviceDiscoveryFailure //500
StatusApplianceIdDoesNotExist //404
StatusBladeIdDoesNotExist //404
@@ -186,6 +187,8 @@ func (e StatusCodeType) String() string {
return "Rename Blade Failure"
case StatusHostRenameFailure:
return "Rename Host Failure"
+ case StatusDeviceDiscoveryFailure:
+ return "Device Discovery Failure"
}
return "Unknown"
@@ -242,7 +245,8 @@ func (e StatusCodeType) HttpStatusCode() int {
StatusHostDeleteSessionFailure,
StatusApplianceCreateSessionFailure,
StatusApplianceDeleteSessionFailure,
- StatusManagerInitializationFailure:
+ StatusManagerInitializationFailure,
+ StatusDeviceDiscoveryFailure:
return http.StatusInternalServerError // 500
case StatusAppliancesExceedMaximum,
StatusBladesExceedMaximum,
diff --git a/pkg/manager/appliance.go b/pkg/manager/appliance.go
index e52c672..f35e057 100644
--- a/pkg/manager/appliance.go
+++ b/pkg/manager/appliance.go
@@ -5,6 +5,7 @@ package manager
import (
"context"
"fmt"
+ "strings"
"github.com/google/uuid"
"k8s.io/klog/v2"
@@ -97,12 +98,27 @@ func (a *Appliance) AddBlade(ctx context.Context, c *openapi.Credentials) (*Blad
newErr := fmt.Errorf("create session failure at [%s:%d] using interface [%s]: %w", c.IpAddress, c.Port, backendName, err)
logger.Error(newErr, "failure: add blade")
+ bladeId := c.CustomId
+ if bladeId == "" { // Order CustomeId > BladeSN > UUID
+ bladeId = response.ChassisSN
+ if bladeId == "" {
+ // Generate default id using last N digits of a randomly generated uuid combined with the default prefix
+ // Example uuid: ee0328d9-258a-4e81-976e-b75aa4a2d8f5
+ uuid := uuid.New().String()
+ uuid = strings.ReplaceAll(uuid, "-", "")
+ bladeId = fmt.Sprintf("%s-%s", ID_PREFIX_BLADE_DFLT, uuid[(len(uuid)-common.NumUuidCharsForId):])
+ }
+ c.CustomId = bladeId
+ }
+
// Continue adding the failed blade to the datastore, but update the connection status to unavailable
newBlade := &Blade{
Id: c.CustomId,
Uri: GetCfmUriBladeId(a.Id, c.CustomId),
Status: common.UNAVAILABLE,
ApplianceId: a.Id,
+ backendOps: ops,
+ creds: c,
}
a.Blades[newBlade.Id] = newBlade
@@ -171,6 +187,8 @@ func (a *Appliance) AddBlade(ctx context.Context, c *openapi.Credentials) (*Blad
Uri: GetCfmUriBladeId(a.Id, c.CustomId),
Status: common.UNAVAILABLE,
ApplianceId: a.Id,
+ backendOps: ops,
+ creds: c,
}
a.Blades[newBlade.Id] = newBlade
@@ -295,11 +313,11 @@ func (a *Appliance) DeleteBladeById(ctx context.Context, bladeId string) (*Blade
blade, err := a.DeleteBladeByIdBackend(ctx, bladeId)
if err != nil || blade == nil {
- logger.V(2).Info("success: delete blade by id after backend session failure", "bladeId", blade.Id, "applianceId", a.Id)
+ logger.V(2).Info("success: delete blade by id after backend session failure", "bladeId", bladeId, "applianceId", a.Id)
return blade, err
}
- logger.V(2).Info("success: delete blade by id", "bladeId", blade.Id, "applianceId", a.Id)
+ logger.V(2).Info("success: delete blade by id", "bladeId", bladeId, "applianceId", a.Id)
return blade, nil
}
diff --git a/pkg/manager/manager.go b/pkg/manager/manager.go
index ac26076..0e94041 100644
--- a/pkg/manager/manager.go
+++ b/pkg/manager/manager.go
@@ -5,7 +5,9 @@ package manager
import (
"context"
"fmt"
+ "strings"
+ "github.com/google/uuid"
"k8s.io/klog/v2"
"cfm/pkg/backend"
@@ -281,11 +283,26 @@ func AddHost(ctx context.Context, c *openapi.Credentials) (*Host, error) {
newErr := fmt.Errorf("create session failure at [%s:%d] using interface [%s]: %w", c.IpAddress, c.Port, backendName, err)
logger.Error(newErr, "failure: add host")
+ hostId := c.CustomId
+ if hostId == "" { // Order CustomeId > HostSN > UUID
+ hostId = response.ChassisSN
+ if hostId == "" {
+ // Generate default id using last N digits of the session id combined with the default prefix
+ // Example uuid: ee0328d9-258a-4e81-976e-b75aa4a2d8f5
+ uuid := uuid.New().String()
+ uuid = strings.ReplaceAll(uuid, "-", "")
+ hostId = fmt.Sprintf("%s-%s", ID_PREFIX_HOST_DFLT, uuid[(len(uuid)-common.NumUuidCharsForId):])
+ }
+ c.CustomId = hostId
+ }
+
// Continue adding the failed host to the datastore, but update the connection status to unavailable
host := &Host{
- Id: c.CustomId,
- Uri: GetCfmUriHostId(c.CustomId),
- Status: common.UNAVAILABLE,
+ Id: c.CustomId,
+ Uri: GetCfmUriHostId(c.CustomId),
+ Status: common.UNAVAILABLE,
+ backendOps: ops,
+ creds: c,
}
deviceCache.AddHost(host, false)
@@ -348,9 +365,11 @@ func AddHost(ctx context.Context, c *openapi.Credentials) (*Host, error) {
// Continue adding the failed host to the datastore, but update the connection status to unavailable
host := &Host{
- Id: c.CustomId,
- Uri: GetCfmUriHostId(c.CustomId),
- Status: common.UNAVAILABLE,
+ Id: c.CustomId,
+ Uri: GetCfmUriHostId(c.CustomId),
+ Status: common.UNAVAILABLE,
+ backendOps: ops,
+ creds: c,
}
deviceCache.AddHost(host, false)
@@ -487,11 +506,11 @@ func DeleteHostById(ctx context.Context, hostId string) (*Host, error) {
host, err := DeleteHostByIdBackend(ctx, hostId)
if err != nil || host == nil {
- logger.V(2).Info("success: delete host by id after backend session failure", "hostId", host.Id)
+ logger.V(2).Info("success: delete host by id after backend session failure", "hostId", hostId)
return host, err
}
- logger.V(2).Info("success: delete host by id", "hostId", host.Id)
+ logger.V(2).Info("success: delete host by id", "hostId", hostId)
return host, nil
}
diff --git a/services/discovery.go b/services/discovery.go
index df0955d..9a71542 100644
--- a/services/discovery.go
+++ b/services/discovery.go
@@ -1,6 +1,7 @@
package services
import (
+ "fmt"
"log"
"golang.org/x/net/context"
@@ -12,12 +13,13 @@ import (
// discoverDevices function to call the DiscoverDevices API
func DiscoverDevices(ctx context.Context, apiService openapi.DefaultAPIServicer, deviceType string) (openapi.ImplResponse, error) {
- resp, err := apiService.DiscoverDevices(ctx, deviceType)
- if err != nil {
- log.Printf("Error discovering devices of type %s: %v", deviceType, err)
+ resp, _ := apiService.DiscoverDevices(ctx, deviceType)
+ if resp.Code >= 300 {
+ err := fmt.Errorf("error discovering devices of type %s: %+v", deviceType, resp)
+ log.Print(err)
return resp, err
} else {
- log.Printf("Discovered devices of type %s: %v", deviceType, resp)
+ log.Printf("Discovered devices of type %s: %+v", deviceType, resp)
return resp, nil
}
}
diff --git a/webui/src/components/Appliance/Appliances.vue b/webui/src/components/Appliance/Appliances.vue
index 3651a4e..07fe502 100644
--- a/webui/src/components/Appliance/Appliances.vue
+++ b/webui/src/components/Appliance/Appliances.vue
@@ -93,6 +93,7 @@
variant="text"
id="addBlade"
@click="addNewBladeWindowButton"
+ :disabled="isAddBladeButtonDisabled"
>
mdi-plus-thick
BLADE
@@ -1524,6 +1525,12 @@ export default {
ComposeMemoryButton,
},
+ computed: {
+ isAddBladeButtonDisabled() {
+ return this.selectedApplianceId === "CMA_Discovered_Blades";
+ },
+ },
+
methods: {
/* Open the add appliance popup */
addNewApplianceWindowButton() {
@@ -1985,7 +1992,10 @@ export default {
applianceStore.selectedApplianceId,
newBladeId
),
- bladeStore.fetchBladeById(applianceStore.selectedApplianceId, newBladeId),
+ bladeStore.fetchBladeById(
+ applianceStore.selectedApplianceId,
+ newBladeId
+ ),
]);
// Update the URL with the new blade ID
updateUrlWithBladeId(applianceStore.selectedApplianceId, newBladeId);
@@ -2063,4 +2073,4 @@ export default {
.highlighted-tab {
font-weight: bold;
}
-
\ No newline at end of file
+
diff --git a/webui/src/components/Dashboard/Dashboard.vue b/webui/src/components/Dashboard/Dashboard.vue
index c0aa88c..07aaad5 100644
--- a/webui/src/components/Dashboard/Dashboard.vue
+++ b/webui/src/components/Dashboard/Dashboard.vue
@@ -3,7 +3,7 @@
- {{ buttonLabel }}
-
+
+
+
+ {{ buttonLabel }}
+
+
+
+
+ Click to discover new devices
+
+
+
+
+
+
+ mdi-magnify
+
+
+
+
+
+ Devices
+
+
+ mdi-rectangle
+ CMA
+
+
+
+
+ mdi-rectangle
+ Blade
+
+
+
+
+ mdi-rectangle
+ Host
+
+
+
Status
+
+
+ mdi-rectangle-outline
+ online
+
+
+
+
+ mdi-rectangle-outline
+ offline
+
+
+
+
+ mdi-rectangle-outline
+ unavailable
+
+
+
+
+
-
-
-
- mdi-magnify
-
-
-
+
+
+
+
+
+ New Discovered Blades:
+
+
+ New Discovered Hosts:
+
+
+
+
+
+ Cancel
+ Add
+
+
+
+
+
+
+
+
+
+
+ {{ addNewDiscoveredDevicesProgressText }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ discoverDevicesProgressText }}
+
+
+
+
+
+
+
+
+
+
+ Congrats! New devices were added
+
+ New blades:
+
New hosts:
+
+
+
+
+
+ Done
+
+
+
+
@@ -68,6 +265,110 @@ import { ControlButton, Controls } from "@vue-flow/controls";
export default {
components: { VueFlow, ControlButton, Controls },
+ data() {
+ return {
+ addNewDiscoveredDevicesProgressText:
+ "Adding the selected devices, please wait...",
+ discoverDevicesProgressText:"Discovering devices, please wait...",
+
+ dialogNewDiscoveredDevices: false,
+ dialogAddNewDiscoveredDevicesWait: false,
+ dialogAddNewDiscoveredDevicesOutput: false,
+ dialogDiscoverDevicesWait: false,
+
+ discoveredBlades: [],
+ discoveredHosts: [],
+
+ selectedBlades: [],
+ selectedHosts: [],
+
+ newBlades: [],
+ newHosts: [],
+ };
+ },
+
+ methods: {
+ async discoverDevices() {
+ this.dialogDiscoverDevicesWait = true;
+ const applianceStore = useApplianceStore();
+ const hostStore = useHostStore();
+
+ try {
+ const responseOfBlades = await applianceStore.discoverBlades();
+ const responseOfHosts = await hostStore.discoverHosts();
+
+ const response = (responseOfBlades || []).concat(responseOfHosts || []);
+ this.discoveredBlades = responseOfBlades || [];
+ this.discoveredHosts = responseOfHosts || [];
+
+ this.dialogNewDiscoveredDevices = true;
+ this.dialogDiscoverDevicesWait = false;
+
+ return response.length ? response : [];
+ } catch (error) {
+ this.dialogDiscoverDevicesWait = false;
+ console.error("Error fetching data:", error);
+ return [];
+ }
+ },
+
+ async addDiscoveredDevices() {
+ this.dialogNewDiscoveredDevices = false;
+ this.dialogAddNewDiscoveredDevicesWait = true;
+
+ const applianceStore = useApplianceStore();
+ const hostStore = useHostStore();
+ const bladePortStore = useBladePortStore();
+
+ if (this.selectedBlades.length === 0) {
+ console.log("No blades selected.");
+ } else {
+ for (var i = 0; i < this.selectedBlades.length; i++) {
+ try {
+ const newAddedBlade = await applianceStore.addDiscoveredBlades(
+ this.selectedBlades[i]
+ );
+
+ if (newAddedBlade) {
+ this.newBlades.push(newAddedBlade);
+ }
+ } catch (error) {
+ console.error("Error adding new discovered blade:", error);
+ }
+ }
+ }
+
+ if (this.selectedHosts.length === 0) {
+ console.log("No hosts selected.");
+ } else {
+ for (var i = 0; i < this.selectedHosts.length; i++) {
+ try {
+ const newAddedHost = await hostStore.addDiscoveredHosts(
+ this.selectedHosts[i]
+ );
+ if (newAddedHost) {
+ this.newHosts.push(newAddedHost);
+ }
+ } catch (error) {
+ console.error("Error adding new discovered host:", error);
+ }
+ }
+ }
+
+ // Update the graph content
+ await applianceStore.fetchAppliances();
+ await hostStore.fetchHosts();
+ for (const appliance of applianceStore.applianceIds) {
+ for (const blade of appliance.blades) {
+ await bladePortStore.fetchBladePorts(appliance.id, blade.id);
+ }
+ }
+
+ this.dialogAddNewDiscoveredDevicesWait = false;
+ this.dialogAddNewDiscoveredDevicesOutput = true;
+ },
+ },
+
setup() {
const applianceStore = useApplianceStore();
const hostStore = useHostStore();
@@ -178,8 +479,8 @@ export default {
await hostStore.fetchHosts();
// Ensure blade ports are fetched after appliances, this action will create the edges for dataPlane
for (const appliance of applianceStore.applianceIds) {
- for (const bladeId of appliance.bladeIds) {
- await bladePortStore.fetchBladePorts(appliance.id, bladeId);
+ for (const blade of appliance.blades) {
+ await bladePortStore.fetchBladePorts(appliance.id, blade.id);
}
}
});
@@ -200,3 +501,22 @@ export default {
},
};
+
+
diff --git a/webui/src/components/Dashboard/initial-control-elements.ts b/webui/src/components/Dashboard/initial-control-elements.ts
index 5ba362a..0d97900 100644
--- a/webui/src/components/Dashboard/initial-control-elements.ts
+++ b/webui/src/components/Dashboard/initial-control-elements.ts
@@ -23,7 +23,7 @@ export const useControlData = () => {
id: "cfm-service",
data: { label: "CFM Service", },
position: position,
- style: { backgroundColor: "#6ebe4a", color: "#000" },
+ style: { backgroundColor: useLayout().Colors.serviceColor, border: "none" },
type: serviceNodeType,
},
]
@@ -35,26 +35,33 @@ export const useControlData = () => {
id: `appliance-${appliance.id}`,
data: { label: appliance.id, url: `/appliances/${appliance.id}` },
position: position,
- style: { backgroundColor: "#f2ae72", color: "#000" },
+ style: { backgroundColor: useLayout().Colors.applianceColor, border: "none" },
type: applianceNodeType,
},
- ...appliance.bladeIds.map((bladeId, bladeIndex) => ({
- id: `blade-${bladeId}`,
- data: { label: bladeId, url: `/appliances/${appliance.id}/blades/${bladeId}`, associatedAppliance: appliance.id },
- position: position,
- style: { backgroundColor: "#f2e394", color: "#000" },
- type: bladeNodeType,
- })),
+ ...appliance.blades.map((blade, bladeIndex) => {
+ const borderColor = useLayout().borderColorChange(blade.status);
+ return {
+ id: `blade-${blade.id}`,
+ data: { label: blade.id, url: `/appliances/${appliance.id}/blades/${blade.id}`, associatedAppliance: appliance.id },
+ position: position,
+ style: { backgroundColor: useLayout().Colors.baldeColor, border: `3px solid ${borderColor}` },
+ type: bladeNodeType,
+ }
+ }),
]
);
- const hostNodes = hostStore.hostIds.map((host, index) => ({
- id: `host-${host}`,
- data: { label: host, url: `/hosts/${host}` },
- position: position,
- style: { backgroundColor: "#d9ecd0", color: "#000" },
- type: hostNodeType,
- }));
+ const hostNodes = hostStore.hostIds.map((host, index) => {
+ const borderColor = useLayout().borderColorChange(host.status);
+
+ return {
+ id: `host-${host.id}`,
+ data: { label: host.id, url: `/hosts/${host.id}` },
+ position: position,
+ style: { backgroundColor: useLayout().Colors.hostColor, border: `3px solid ${borderColor}` },
+ type: hostNodeType,
+ }
+ });
const allNodes = [...coreNode, ...applianceNodes, ...hostNodes];
@@ -67,18 +74,18 @@ export const useControlData = () => {
source: "cfm-service",
target: `appliance-${appliance.id}`,
},
- ...appliance.bladeIds.map((bladeId) => ({
- id: `appliance-blade-${appliance.id}-${bladeId}`,
+ ...appliance.blades.map((blade) => ({
+ id: `appliance-blade-${appliance.id}-${blade.id}`,
source: `appliance-${appliance.id}`,
- target: `blade-${bladeId}`,
+ target: `blade-${blade.id}`,
})),
])
: [];
const hostEdges = hostStore.hostIds.map((host) => ({
- id: `cfm-${host}`,
+ id: `cfm-${host.id}`,
source: "cfm-service",
- target: `host-${host}`,
+ target: `host-${host.id}`,
}));
return [...coreEdges, ...hostEdges];
@@ -97,19 +104,19 @@ export const useControlData = () => {
target: `appliance-${appliance.id}`,
animated: true,
},
- ...appliance.bladeIds.map((bladeId) => ({
- id: `appliance-blade-${appliance.id}-${bladeId}`,
+ ...appliance.blades.map((blade) => ({
+ id: `appliance-blade-${appliance.id}-${blade.id}`,
source: `appliance-${appliance.id}`,
- target: `blade-${bladeId}`,
+ target: `blade-${blade.id}`,
animated: true,
})),
])
: [];
const hostEdges = hostStore.hostIds.map((host) => ({
- id: `cfm-${host}`,
+ id: `cfm-${host.id}`,
source: "cfm-service",
- target: `host-${host}`,
+ target: `host-${host.id}`,
animated: true,
}));
diff --git a/webui/src/components/Dashboard/initial-data-elements.ts b/webui/src/components/Dashboard/initial-data-elements.ts
index 28e4538..c4ec05e 100644
--- a/webui/src/components/Dashboard/initial-data-elements.ts
+++ b/webui/src/components/Dashboard/initial-data-elements.ts
@@ -3,6 +3,7 @@ import { computed } from "vue";
import { useApplianceStore } from "../Stores/ApplianceStore";
import { useHostStore } from "../Stores/HostStore";
import { useBladePortStore } from "../Stores/BladePortStore";
+import { useLayout } from "./useLayout";
export const useData = () => {
const applianceStore = useApplianceStore();
@@ -17,7 +18,7 @@ export const useData = () => {
let currentYPosition = 0;
const applianceNodes = applianceStore.applianceIds.flatMap(
(appliance, index) => {
- const bladeCount = appliance.bladeIds.length;
+ const bladeCount = appliance.blades.length;
const applianceHeight = 50 + bladeCount * 50; // Adjust height based on number of blades
const applianceWidth = 270; // Width of the appliance node
const bladeWidth = 250; // Width of the blade node
@@ -27,24 +28,27 @@ export const useData = () => {
id: `appliance-${appliance.id}`,
data: { label: appliance.id, url: `/appliances/${appliance.id}` },
position: { x: 100, y: currentYPosition },
- style: { backgroundColor: "rgba(242, 174, 114, 0.5)", color: "#000", height: `${applianceHeight}px`, width: `${applianceWidth}px` },
+ style: { backgroundColor: useLayout().Colors.applianceColor, height: `${applianceHeight}px`, width: `${applianceWidth}px`, border: "none" },
type: applianceNodeType,
sourcePosition: 'right',
targetPosition: 'left',
};
- const bladeNodes = appliance.bladeIds.map((bladeId, bladeIndex) => ({
- id: `blade-${bladeId}`,
- data: { label: bladeId, url: `/appliances/${appliance.id}/blades/${bladeId}`, associatedAppliance: appliance.id },
- position: { x: bladeXPosition, y: 50 + bladeIndex * 50 }, // Center blades within the appliance node
- style: { backgroundColor: "#f2e394", color: "#000", width: `${bladeWidth}px` },
- type: bladeNodeType,
- parentNode: `appliance-${appliance.id}`,
- extent: 'parent',
- expandParent: true,
- sourcePosition: 'right',
- targetPosition: 'left',
- }));
+ const bladeNodes = appliance.blades.map((blade, bladeIndex) => {
+ const borderColor = useLayout().borderColorChange(blade.status);
+ return {
+ id: `blade-${blade.id}`,
+ data: { label: blade.id, url: `/appliances/${appliance.id}/blades/${blade.id}`, associatedAppliance: appliance.id },
+ position: { x: bladeXPosition, y: 50 + bladeIndex * 50 }, // Center blades within the appliance node
+ style: { backgroundColor: useLayout().Colors.baldeColor, width: `${bladeWidth}px`, border: `3px solid ${borderColor}` },
+ type: bladeNodeType,
+ parentNode: `appliance-${appliance.id}`,
+ extent: 'parent',
+ expandParent: true,
+ sourcePosition: 'right',
+ targetPosition: 'left',
+ }
+ });
currentYPosition += applianceHeight + 20; // Add some space between nodes
@@ -52,15 +56,26 @@ export const useData = () => {
}
);
- const hostNodes = hostStore.hostIds.map((host, index) => ({
- id: `host-${host}`,
- data: { label: host, url: `/hosts/${host}` },
- position: { x: 500, y: index * 200 },
- style: { backgroundColor: "#d9ecd0", color: "#000" },
- type: hostNodeType,
- sourcePosition: 'right',
- targetPosition: 'left',
- }));
+ const hostNodes = hostStore.hostIds.map((host, index) => {
+ const { width, height } = useLayout().measureText(host.id);
+ const borderColor = useLayout().borderColorChange(host.status);
+
+ return {
+ id: `host-${host.id}`,
+ data: { label: host.id, url: `/hosts/${host.id}` },
+ position: { x: 500, y: index * 200 },
+ style: {
+ backgroundColor: useLayout().Colors.hostColor,
+ color: "#000",
+ width: `${width + 20}px`, // Adding some padding
+ height: `${height + 20}px`, // Adding some padding
+ border: `3px solid ${borderColor}`
+ },
+ type: hostNodeType,
+ sourcePosition: 'right',
+ targetPosition: 'left',
+ };
+ });
return [...applianceNodes, ...hostNodes];
});
diff --git a/webui/src/components/Dashboard/useLayout.ts b/webui/src/components/Dashboard/useLayout.ts
index acf3506..e6b6a4e 100644
--- a/webui/src/components/Dashboard/useLayout.ts
+++ b/webui/src/components/Dashboard/useLayout.ts
@@ -7,6 +7,39 @@ import { ref } from 'vue';
* Composable to run the layout algorithm on the graph.
* It uses the `dagre` library to calculate the layout of the nodes and edges.
*/
+
+export function measureText(text: string, font = '16px Arial') {
+ const canvas = document.createElement('canvas');
+ const context = canvas.getContext('2d');
+ context!.font = font;
+ const metrics = context!.measureText(text);
+ const width = Math.max(metrics.width, 220);
+ return {
+ width: width,
+ height: parseInt(font, 10) // Assuming height is roughly the font size
+ };
+};
+
+export const Colors = {
+ applianceColor: '#f2ae72',
+ baldeColor: '#f2e394',
+ hostColor: '#d9ecd0',
+ serviceColor: '#6ebe4a',
+};
+
+export function borderColorChange(status: string | undefined) {
+ switch (status) {
+ case "online":
+ return "#6ebe4a"; // green
+ case "offline":
+ return "#b00020"; // Red
+ case "unavailable":
+ return "#ff9f40"; // Orange
+ default:
+ return "#ffffff"; // White
+ }
+};
+
export function useLayout() {
const { findNode } = useVueFlow();
@@ -28,10 +61,13 @@ export function useLayout() {
previousDirection.value = direction;
for (const node of nodes) {
- // Use the dimensions property of the internal node (`GraphNode` type)
- const graphNode = findNode(node.id);
+ // Measure the text dimensions for dynamic sizing
+ const { width, height } = measureText(node.data.label);
- dagreGraph.setNode(node.id, { width: graphNode?.dimensions.width || 150, height: graphNode?.dimensions.height || 50 });
+ dagreGraph.setNode(node.id, {
+ width: width + 20, // Adding some padding
+ height: height + 20 // Adding some padding
+ });
}
for (const edge of edges) {
@@ -41,7 +77,7 @@ export function useLayout() {
dagre.layout(dagreGraph);
// Set nodes with updated positions
- return nodes.map((node: { id: string | dagre.Label; }) => {
+ return nodes.map((node: { id: string | dagre.Label; style: any; }) => {
const nodeWithPosition = dagreGraph.node(node.id);
return {
@@ -49,9 +85,14 @@ export function useLayout() {
targetPosition: isHorizontal ? Position.Left : Position.Top,
sourcePosition: isHorizontal ? Position.Right : Position.Bottom,
position: { x: nodeWithPosition.x, y: nodeWithPosition.y },
+ style: {
+ ...node.style,
+ width: `${nodeWithPosition.width}px`,
+ height: `${nodeWithPosition.height}px`
+ }
};
});
}
- return { graph, layout, previousDirection };
-}
+ return { graph, layout, previousDirection, measureText, borderColorChange, Colors };
+}
\ No newline at end of file
diff --git a/webui/src/components/Stores/ApplianceStore.ts b/webui/src/components/Stores/ApplianceStore.ts
index 661f777..b1ad0d3 100644
--- a/webui/src/components/Stores/ApplianceStore.ts
+++ b/webui/src/components/Stores/ApplianceStore.ts
@@ -1,6 +1,6 @@
// Copyright (c) 2024 Seagate Technology LLC and/or its Affiliates
import { defineStore } from 'pinia'
-import { Appliance, Credentials, DefaultApi } from "@/axios/api";
+import { Appliance, Credentials, DefaultApi, DiscoveredDevice } from "@/axios/api";
import { BASE_PATH } from "@/axios/base";
import axios from 'axios';
@@ -14,7 +14,30 @@ export const useApplianceStore = defineStore('appliance', {
addApplianceError: null as unknown,
deleteApplianceError: null as unknown,
renameApplianceError: null as unknown,
- applianceIds: [] as { id: string, bladeIds: string[] }[],
+ applianceIds: [] as { id: string, blades: { id: string, ipAddress: string, status: string | undefined }[] }[],
+ discoveredBlades: [] as DiscoveredDevice[],
+
+ prefixBladeId: "Discoverd_Blade_",
+ newBladeCredentials: {
+ username: "root",
+ password: "0penBmc",
+ ipAddress: "127.0.0.1",
+ port: 443,
+ insecure: true,
+ protocol: "https",
+ customId: "",
+ },
+
+ defaultApplianceId: "CMA_Discovered_Blades",
+ newApplianceCredentials: {
+ username: "root",
+ password: "0penBmc",
+ ipAddress: "127.0.0.1",
+ port: 8443,
+ insecure: true,
+ protocol: "https",
+ customId: "",
+ },
}),
actions: {
@@ -72,7 +95,7 @@ export const useApplianceStore = defineStore('appliance', {
const responseOfBlades = await defaultApi.bladesGet(applianceId);
const bladeCount = responseOfBlades.data.memberCount;
- const bladeIds = [];
+ const associatedBlades = [];
for (let i = 0; i < bladeCount; i++) {
// Extract the id for each blade
@@ -80,10 +103,12 @@ export const useApplianceStore = defineStore('appliance', {
const bladeId: string = JSON.stringify(uri).split("/").pop()?.slice(0, -2) as string;
// Store blade in blades
if (bladeId) {
- bladeIds.push(bladeId);
+ const responseOfBlade = await defaultApi.bladesGetById(applianceId, bladeId);
+ const response = { id: responseOfBlade.data.id, ipAddress: responseOfBlade.data.ipAddress, status: responseOfBlade.data.status }
+ associatedBlades.push(response);
}
}
- this.applianceIds.push({ id: detailsResponseOfAppliance.data.id, bladeIds });
+ this.applianceIds.push({ id: detailsResponseOfAppliance.data.id, blades: associatedBlades });
}
}
} catch (error) {
@@ -91,13 +116,75 @@ export const useApplianceStore = defineStore('appliance', {
}
},
+ async discoverBlades() {
+ try {
+ // Get all the existed blades
+ const existedBladeIpAddress: (string | undefined)[] = []
+ for (var i = 0; i < this.applianceIds.length; i++) {
+ for (var j = 0; j < this.applianceIds[i].blades.length; j++) {
+ existedBladeIpAddress.push(this.applianceIds[i].blades[j].ipAddress)
+ }
+ }
+
+ const defaultApi = new DefaultApi(undefined, API_BASE_PATH);
+ this.discoveredBlades = [];
+ const responseOfBlade = await defaultApi.discoverDevices("blade");
+ this.discoveredBlades = responseOfBlade.data;
+
+ // Remove the existed blades from the discovered blades
+ for (var k = 0; k < this.discoveredBlades.length; k++) {
+ for (var m = 0; m < existedBladeIpAddress.length; m++) {
+ this.discoveredBlades = this.discoveredBlades.filter(
+ (discoveredBlade) => discoveredBlade.address !== existedBladeIpAddress[m]
+ );
+ }
+ }
+
+ return this.discoveredBlades
+ } catch (error) {
+ console.error("Error discovering new devices:", error);
+ }
+ },
+
+ async addDiscoveredBlades(blade: DiscoveredDevice) {
+ const defaultApi = new DefaultApi(undefined, API_BASE_PATH);
+ const responseOfApplianceExist = await defaultApi.appliancesGetById(this.defaultApplianceId)
+
+ // If there is no default appliance, add one
+ if (!responseOfApplianceExist) {
+ this.newApplianceCredentials.customId = this.defaultApplianceId;
+ const responseOfAppliance = await defaultApi.appliancesPost(this.newApplianceCredentials);
+
+ // Add the new appliance to the appliances and applianceIds array
+ if (responseOfAppliance) {
+ this.appliances.push(responseOfAppliance.data);
+ const newAppliance = { id: responseOfAppliance.data.id, blades: [] }
+ this.applianceIds.push(newAppliance)
+ }
+ }
+
+ // Add the new discovered blade to the default appliance
+ let appliance = this.applianceIds.find(appliance => appliance.id === this.defaultApplianceId);
+
+ this.newBladeCredentials.customId = this.prefixBladeId + blade.address;
+ this.newBladeCredentials.ipAddress = blade.address + "";
+
+ const responseOfBlade = await defaultApi.bladesPost(this.defaultApplianceId, this.newBladeCredentials);
+
+ if (responseOfBlade) {
+ const response = { id: responseOfBlade.data.id, ipAddress: responseOfBlade.data.ipAddress, status: responseOfBlade.data.status };
+ appliance!.blades.push(response);
+ }
+
+ return responseOfBlade.data;
+ },
+
async addNewAppliance(newAppliance: Credentials) {
this.addApplianceError = "";
try {
const defaultApi = new DefaultApi(undefined, API_BASE_PATH);
const response = await defaultApi.appliancesPost(newAppliance);
const addedAppliance = response.data;
- console.log("added appliance", addedAppliance)
// Add the new appliance to the appliances array
this.appliances.push(addedAppliance);
return addedAppliance;
diff --git a/webui/src/components/Stores/HostStore.ts b/webui/src/components/Stores/HostStore.ts
index 5051c54..ae3e44a 100644
--- a/webui/src/components/Stores/HostStore.ts
+++ b/webui/src/components/Stores/HostStore.ts
@@ -1,6 +1,6 @@
// Copyright (c) 2024 Seagate Technology LLC and/or its Affiliates
import { defineStore } from 'pinia'
-import { Host, Credentials, DefaultApi } from "@/axios/api";
+import { Host, Credentials, DefaultApi, DiscoveredDevice } from "@/axios/api";
import { BASE_PATH } from "@/axios/base";
import axios from 'axios';
@@ -19,7 +19,19 @@ export const useHostStore = defineStore('host', {
deleteHostError: null as unknown,
resyncHostError: null as unknown,
renameHostError: null as unknown,
- hostIds: [] as string[],
+ hostIds: [] as { id: string, ipAddress: string, status: string | undefined }[],
+ discoveredHosts: [] as DiscoveredDevice[],
+
+ prefixHostId: "Discoverd_Host_",
+ newHostCredentials: {
+ username: "admin",
+ password: "admin12345",
+ ipAddress: "127.0.0.1",
+ port: 8082,
+ insecure: true,
+ protocol: "http",
+ customId: "",
+ },
}),
actions: {
@@ -44,7 +56,8 @@ export const useHostStore = defineStore('host', {
// Store host in hosts
if (detailsResponseOfHost) {
this.hosts.push(detailsResponseOfHost.data);
- this.hostIds.push(detailsResponseOfHost.data.id)
+ const host = { id: detailsResponseOfHost.data.id, ipAddress: detailsResponseOfHost.data.ipAddress, status: detailsResponseOfHost.data.status }
+ this.hostIds.push(host)
}
}
} catch (error) {
@@ -68,6 +81,51 @@ export const useHostStore = defineStore('host', {
}
},
+ async discoverHosts() {
+ try {
+ // Get all the existed hosts
+ const existedHostIpAddress: (string | undefined)[] = []
+ for (var i = 0; i < this.hostIds.length; i++) {
+ existedHostIpAddress.push(this.hostIds[i].ipAddress)
+ }
+
+ const defaultApi = new DefaultApi(undefined, API_BASE_PATH);
+ this.discoveredHosts = [];
+ const responseOfHost = await defaultApi.discoverDevices("cxl-host");
+ this.discoveredHosts = responseOfHost.data;
+
+ // Remove the existed hosts from the discovered hosts
+ for (var k = 0; k < this.discoveredHosts.length; k++) {
+ for (var m = 0; m < existedHostIpAddress.length; m++) {
+ this.discoveredHosts = this.discoveredHosts.filter(
+ (discoveredHost) => discoveredHost.address !== existedHostIpAddress[m]
+ );
+ }
+ }
+
+ return this.discoveredHosts
+ } catch (error) {
+ console.error("Error discovering new devices:", error);
+ }
+ },
+
+ async addDiscoveredHosts(host: DiscoveredDevice) {
+ const defaultApi = new DefaultApi(undefined, API_BASE_PATH);
+ // Add all the new didcovered hosts
+ this.newHostCredentials.customId = this.prefixHostId + host.address;
+ this.newHostCredentials.ipAddress = host.address + "";
+
+ const responseOfHost = await defaultApi.hostsPost(this.newHostCredentials);
+
+ // Update the applianceIds and appliances
+ if (responseOfHost) {
+ const response = { id: responseOfHost.data.id, ipAddress: responseOfHost.data.ipAddress, status: responseOfHost.data.status }
+ this.hosts.push(responseOfHost.data);
+ this.hostIds.push(response)
+ }
+ return responseOfHost.data;
+ },
+
async addNewHost(newHost: Credentials) {
this.addHostError = "";
try {