2022-07-21 15:21:31 -07:00
// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: BUSL-1.1
2023-02-02 17:15:17 -08:00
2021-02-23 19:06:39 -05:00
package hostsetscmd
import (
"fmt"
"time"
"github.com/hashicorp/boundary/api"
"github.com/hashicorp/boundary/api/hostsets"
"github.com/hashicorp/boundary/internal/cmd/base"
"github.com/hashicorp/boundary/internal/cmd/common"
)
func init () {
extraActionsFlagsMapFunc = extraActionsFlagsMapFuncImpl
extraSynopsisFunc = extraSynopsisFuncImpl
extraFlagsFunc = extraFlagsFuncImpl
extraFlagsHandlingFunc = extraFlagsHandlingFuncImpl
executeExtraActions = executeExtraActionsImpl
}
type extraCmdVars struct {
flagHosts [] string
}
func extraActionsFlagsMapFuncImpl () map [ string ][] string {
return map [ string ][] string {
"add-hosts" : { "id" , "host" , "version" },
"set-hosts" : { "id" , "host" , "version" },
"remove-hosts" : { "id" , "host" , "version" },
}
}
func extraSynopsisFuncImpl ( c * Command ) string {
switch c . Func {
case "add-hosts" :
return "Add hosts to the specified host set"
case "remove-hosts" :
return "Remove hosts from the specified host set"
case "set-hosts" :
return "Set the full contents of the hosts on the specified host set"
default :
return common . SynopsisFunc ( c . Func , "host set" )
}
}
func ( c * Command ) extraHelpFunc ( helpMap map [ string ] func () string ) string {
var helpStr string
switch c . Func {
case "" :
return base . WrapForHelpText ([] string {
"Usage: boundary host-sets [sub command] [options] [args]" ,
"" ,
" This command allows operations on Boundary host set resources. Example:" ,
"" ,
" Read a host set:" ,
"" ,
` $ boundary host-sets read -id hsst_1234567890` ,
"" ,
" Please see the host-sets subcommand help for detailed usage information." ,
})
case "create" :
helpStr = base . WrapForHelpText ([] string {
"Usage: boundary host-sets create [type] [sub command] [options] [args]" ,
"" ,
" This command allows create operations on Boundary host set resources. Example:" ,
"" ,
" Create a static-type host set:" ,
"" ,
` $ boundary host-sets create static -name prodops -description "For ProdOps usage"` ,
"" ,
" Please see the typed subcommand help for detailed usage information." ,
})
case "update" :
helpStr = base . WrapForHelpText ([] string {
"Usage: boundary host-sets update [type] [sub command] [options] [args]" ,
"" ,
" This command allows update operations on Boundary host set resources. Example:" ,
"" ,
" Update a static-type host set:" ,
"" ,
` $ boundary host-sets update static -id hsst_1234567890 -name devops -description "For DevOps usage"` ,
"" ,
" Please see the typed subcommand help for detailed usage information." ,
})
case "add-hosts" :
helpStr = base . WrapForHelpText ([] string {
"Usage: boundary host-sets add-hosts [sub command] [options] [args]" ,
"" ,
" This command allows adding hosts to host set resources, if the types match and the operation is allowed by the given host set type. Example:" ,
"" ,
" Add static-type hosts to a static-type host set:" ,
"" ,
` $ boundary host-sets add-hosts -id hsst_1234567890 -host hst_1234567890 -host hst_0987654321` ,
"" ,
"" ,
})
case "remove-hosts" :
helpStr = base . WrapForHelpText ([] string {
"Usage: boundary host-sets remove-hosts [sub command] [options] [args]" ,
"" ,
" This command allows removing hosts from host set resources, if the types match and the operation is allowed by the given host set type. Example:" ,
"" ,
" Remove static-type hosts from a static-type host set:" ,
"" ,
` $ boundary host-sets remove-hosts -id hsst_1234567890 -host hst_0987654321` ,
"" ,
"" ,
})
case "set-hosts" :
helpStr = base . WrapForHelpText ([] string {
"Usage: boundary host-sets set-hosts [sub command] [options] [args]" ,
"" ,
" This command allows setting the complete set of hosts on host set resources, if the types match and the operation is allowed by the given host set type. Example:" ,
"" ,
" Set the complete set of static-type hosts on a static-type host set:" ,
"" ,
` $ boundary host-sets remove-hosts -id hsst_1234567890 -host hst_1234567890` ,
"" ,
"" ,
})
default :
helpStr = helpMap [ c . Func ]()
}
return helpStr + c . Flags (). Help ()
}
func extraFlagsFuncImpl ( c * Command , _ * base . FlagSets , f * base . FlagSet ) {
for _ , name := range flagsMap [ c . Func ] {
switch name {
case "host" :
f . StringSliceVar ( & base . StringSliceVar {
Name : "host" ,
Target : & c . flagHosts ,
Usage : "The hosts to add, remove, or set. May be specified multiple times." ,
})
}
}
}
2021-04-08 20:54:32 -04:00
func extraFlagsHandlingFuncImpl ( c * Command , _ * base . FlagSets , opts * [] hostsets . Option ) bool {
2021-02-23 19:06:39 -05:00
switch c . Func {
case "add-hosts" , "remove-hosts" :
if len ( c . flagHosts ) == 0 {
c . UI . Error ( "No hosts supplied via -host" )
2021-03-04 20:05:17 -05:00
return false
2021-02-23 19:06:39 -05:00
}
case "set-hosts" :
switch len ( c . flagHosts ) {
case 0 :
c . UI . Error ( "No hosts supplied via -host" )
2021-03-04 20:05:17 -05:00
return false
2021-02-23 19:06:39 -05:00
case 1 :
if c . flagHosts [ 0 ] == "null" {
c . flagHosts = nil
}
}
}
2021-03-04 20:05:17 -05:00
return true
2021-02-23 19:06:39 -05:00
}
2022-07-21 15:21:31 -07:00
func executeExtraActionsImpl ( c * Command , origResp * api . Response , origItem * hostsets . HostSet , origItems [] * hostsets . HostSet , origError error , hostsetClient * hostsets . Client , version uint32 , opts [] hostsets . Option ) ( * api . Response , * hostsets . HostSet , [] * hostsets . HostSet , error ) {
2021-02-23 19:06:39 -05:00
switch c . Func {
case "add-hosts" :
2022-07-21 15:21:31 -07:00
result , err := hostsetClient . AddHosts ( c . Context , c . FlagId , version , c . flagHosts , opts ... )
2022-07-27 10:00:00 -07:00
if err != nil {
return nil , nil , nil , err
}
2022-07-21 15:21:31 -07:00
return result . GetResponse (), result . GetItem (), nil , err
2021-02-23 19:06:39 -05:00
case "remove-hosts" :
2022-07-21 15:21:31 -07:00
result , err := hostsetClient . RemoveHosts ( c . Context , c . FlagId , version , c . flagHosts , opts ... )
2022-07-27 10:00:00 -07:00
if err != nil {
return nil , nil , nil , err
}
2022-07-21 15:21:31 -07:00
return result . GetResponse (), result . GetItem (), nil , err
2021-02-23 19:06:39 -05:00
case "set-hosts" :
2022-07-21 15:21:31 -07:00
result , err := hostsetClient . SetHosts ( c . Context , c . FlagId , version , c . flagHosts , opts ... )
2022-07-27 10:00:00 -07:00
if err != nil {
return nil , nil , nil , err
}
2022-07-21 15:21:31 -07:00
return result . GetResponse (), result . GetItem (), nil , err
2021-02-23 19:06:39 -05:00
}
2022-07-21 15:21:31 -07:00
return origResp , origItem , origItems , origError
2021-02-23 19:06:39 -05:00
}
func ( c * Command ) printListTable ( items [] * hostsets . HostSet ) string {
if len ( items ) == 0 {
return "No host sets found"
}
var output [] string
output = [] string {
"" ,
"Host Set information:" ,
}
2021-05-04 19:57:35 -05:00
for i , item := range items {
2021-02-23 19:06:39 -05:00
if i > 0 {
output = append ( output , "" )
}
2021-05-04 19:57:35 -05:00
if item . Id != "" {
2021-02-23 19:06:39 -05:00
output = append ( output ,
2021-05-04 19:57:35 -05:00
fmt . Sprintf ( " ID: %s" , item . Id ),
)
} else {
output = append ( output ,
fmt . Sprintf ( " ID: %s" , "(not available)" ),
)
}
if item . Version > 0 {
output = append ( output ,
fmt . Sprintf ( " Version: %d" , item . Version ),
2021-02-23 19:06:39 -05:00
)
}
2021-05-04 19:57:35 -05:00
if item . Type != "" {
2021-02-23 19:06:39 -05:00
output = append ( output ,
2021-05-04 19:57:35 -05:00
fmt . Sprintf ( " Type: %s" , item . Type ),
2021-02-23 19:06:39 -05:00
)
}
2021-05-04 19:57:35 -05:00
if item . Name != "" {
2021-02-23 19:06:39 -05:00
output = append ( output ,
2021-05-04 19:57:35 -05:00
fmt . Sprintf ( " Name: %s" , item . Name ),
2021-02-23 19:06:39 -05:00
)
}
2021-05-04 19:57:35 -05:00
if item . Description != "" {
output = append ( output ,
fmt . Sprintf ( " Description: %s" , item . Description ),
)
}
2021-11-11 11:28:08 -05:00
if item . SyncIntervalSeconds != 0 {
output = append ( output ,
fmt . Sprintf ( " Sync Interval: %d seconds" , item . SyncIntervalSeconds ),
)
}
2021-05-04 19:57:35 -05:00
if len ( item . AuthorizedActions ) > 0 {
2021-02-23 19:06:39 -05:00
output = append ( output ,
" Authorized Actions:" ,
2021-05-04 19:57:35 -05:00
base . WrapSlice ( 6 , item . AuthorizedActions ),
2021-02-23 19:06:39 -05:00
)
}
}
return base . WrapForHelpText ( output )
}
2022-07-21 15:21:31 -07:00
func printItemTable ( item * hostsets . HostSet , resp * api . Response ) string {
2022-10-25 18:29:38 -05:00
nonAttributeMap := map [ string ] any {}
2021-05-04 19:57:35 -05:00
if item . Id != "" {
nonAttributeMap [ "ID" ] = item . Id
2021-02-23 19:06:39 -05:00
}
2021-05-04 19:57:35 -05:00
if item . Version != 0 {
nonAttributeMap [ "Version" ] = item . Version
}
if item . Type != "" {
nonAttributeMap [ "Type" ] = item . Type
2021-02-23 19:06:39 -05:00
}
2021-05-04 19:57:35 -05:00
if ! item . CreatedTime . IsZero () {
nonAttributeMap [ "Created Time" ] = item . CreatedTime . Local (). Format ( time . RFC1123 )
}
if ! item . UpdatedTime . IsZero () {
nonAttributeMap [ "Updated Time" ] = item . UpdatedTime . Local (). Format ( time . RFC1123 )
}
if item . Name != "" {
nonAttributeMap [ "Name" ] = item . Name
}
if item . Description != "" {
nonAttributeMap [ "Description" ] = item . Description
}
if item . HostCatalogId != "" {
nonAttributeMap [ "Host Catalog ID" ] = item . HostCatalogId
2021-02-23 19:06:39 -05:00
}
2021-09-20 12:48:38 -04:00
if item . PreferredEndpoints != nil {
nonAttributeMap [ "Preferred Endpoints" ] = item . PreferredEndpoints
}
2021-11-11 11:28:08 -05:00
if item . SyncIntervalSeconds != 0 {
nonAttributeMap [ "Sync Interval" ] = fmt . Sprintf ( "%d seconds" , item . SyncIntervalSeconds )
}
2021-02-23 19:06:39 -05:00
2021-05-04 19:57:35 -05:00
maxLength := base . MaxAttributesLength ( nonAttributeMap , item . Attributes , keySubstMap )
2021-02-23 19:06:39 -05:00
ret := [] string {
"" ,
"Host Set information:" ,
base . WrapMap ( 2 , maxLength + 2 , nonAttributeMap ),
}
2021-05-04 19:57:35 -05:00
if item . Scope != nil {
ret = append ( ret ,
"" ,
" Scope:" ,
base . ScopeInfoForOutput ( item . Scope , maxLength ),
)
}
2021-09-28 09:40:12 -04:00
if item . Plugin != nil {
ret = append ( ret ,
"" ,
" Plugin:" ,
base . PluginInfoForOutput ( item . Plugin , maxLength ),
)
}
if len ( item . Attributes ) > 0 {
ret = append ( ret ,
"" ,
" Attributes:" ,
base . WrapMap ( 4 , maxLength , item . Attributes ),
)
}
2021-05-04 19:57:35 -05:00
if len ( item . AuthorizedActions ) > 0 {
2021-02-23 19:06:39 -05:00
ret = append ( ret ,
"" ,
" Authorized Actions:" ,
2021-05-04 19:57:35 -05:00
base . WrapSlice ( 4 , item . AuthorizedActions ),
2021-02-23 19:06:39 -05:00
)
}
2021-05-04 19:57:35 -05:00
if len ( item . HostIds ) > 0 {
2021-02-23 19:06:39 -05:00
ret = append ( ret ,
"" ,
" Host IDs:" ,
2021-05-04 19:57:35 -05:00
base . WrapSlice ( 4 , item . HostIds ),
2021-02-23 19:06:39 -05:00
)
}
return base . WrapForHelpText ( ret )
}
var keySubstMap = map [ string ] string {}