github.com/LukasHeimann/cloudfoundrycli/v8@v8.4.4/command/v7/service_command.go (about) 1 package v7 2 3 import ( 4 "fmt" 5 "strconv" 6 7 "github.com/LukasHeimann/cloudfoundrycli/v8/actor/v7action" 8 "github.com/LukasHeimann/cloudfoundrycli/v8/command/flag" 9 "github.com/LukasHeimann/cloudfoundrycli/v8/resources" 10 "github.com/LukasHeimann/cloudfoundrycli/v8/util/ui" 11 ) 12 13 const indent = " " 14 15 type ServiceCommand struct { 16 BaseCommand 17 18 RequiredArgs flag.ServiceInstance `positional-args:"yes"` 19 ShowGUID bool `long:"guid" description:"Retrieve and display the given service instances's guid. All other output is suppressed."` 20 Params bool `long:"params" description:"Retrieve and display the given service instances's parameters. All other output is suppressed."` 21 usage interface{} `usage:"CF_NAME service SERVICE_INSTANCE"` 22 relatedCommands interface{} `related_commands:"bind-service, rename-service, update-service"` 23 } 24 25 func (cmd ServiceCommand) Execute(args []string) error { 26 if err := cmd.SharedActor.CheckTarget(true, true); err != nil { 27 return err 28 } 29 switch { 30 case cmd.ShowGUID: 31 return cmd.fetchAndDisplayGUID() 32 case cmd.Params: 33 return cmd.fetchAndDisplayParams() 34 default: 35 return cmd.fetchAndDisplayDetails() 36 } 37 } 38 39 func (cmd ServiceCommand) fetchAndDisplayGUID() error { 40 serviceInstance, _, err := cmd.Actor.GetServiceInstanceByNameAndSpace( 41 string(cmd.RequiredArgs.ServiceInstance), 42 cmd.Config.TargetedSpace().GUID, 43 ) 44 if err != nil { 45 return err 46 } 47 48 cmd.UI.DisplayText(serviceInstance.GUID) 49 return nil 50 } 51 52 func (cmd ServiceCommand) fetchAndDisplayParams() error { 53 params, warnings, err := cmd.Actor.GetServiceInstanceParameters( 54 string(cmd.RequiredArgs.ServiceInstance), 55 cmd.Config.TargetedSpace().GUID, 56 ) 57 cmd.UI.DisplayWarnings(warnings) 58 if err != nil { 59 return err 60 } 61 62 err = cmd.UI.DisplayJSON("", params) 63 if err != nil { 64 return err 65 } 66 return nil 67 } 68 69 func (cmd ServiceCommand) fetchAndDisplayDetails() error { 70 if err := cmd.displayIntro(); err != nil { 71 return err 72 } 73 74 serviceInstanceWithDetails, warnings, err := cmd.Actor.GetServiceInstanceDetails( 75 string(cmd.RequiredArgs.ServiceInstance), 76 cmd.Config.TargetedSpace().GUID, 77 false, 78 ) 79 cmd.UI.DisplayWarnings(warnings) 80 if err != nil { 81 return err 82 } 83 84 switch { 85 case serviceInstanceWithDetails.Type == resources.UserProvidedServiceInstance: 86 cmd.displayPropertiesUserProvided(serviceInstanceWithDetails) 87 cmd.displayLastOperation(serviceInstanceWithDetails) 88 cmd.displayBoundApps(serviceInstanceWithDetails) 89 default: 90 cmd.displayPropertiesManaged(serviceInstanceWithDetails) 91 cmd.displayLastOperation(serviceInstanceWithDetails) 92 cmd.displayBoundApps(serviceInstanceWithDetails) 93 cmd.displaySharingInfo(serviceInstanceWithDetails) 94 cmd.displayUpgrades(serviceInstanceWithDetails) 95 } 96 97 return nil 98 } 99 100 func (cmd ServiceCommand) displayIntro() error { 101 user, err := cmd.Actor.GetCurrentUser() 102 if err != nil { 103 return err 104 } 105 106 cmd.UI.DisplayTextWithFlavor( 107 "Showing info of service {{.ServiceInstanceName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.Username}}...", 108 map[string]interface{}{ 109 "ServiceInstanceName": cmd.RequiredArgs.ServiceInstance, 110 "OrgName": cmd.Config.TargetedOrganization().Name, 111 "SpaceName": cmd.Config.TargetedSpace().Name, 112 "Username": user.Name, 113 }, 114 ) 115 cmd.UI.DisplayNewline() 116 117 return nil 118 } 119 120 func (cmd ServiceCommand) displayPropertiesUserProvided(serviceInstanceWithDetails v7action.ServiceInstanceDetails) { 121 table := [][]string{ 122 {cmd.UI.TranslateText("name:"), serviceInstanceWithDetails.Name}, 123 {cmd.UI.TranslateText("guid:"), serviceInstanceWithDetails.GUID}, 124 {cmd.UI.TranslateText("type:"), string(serviceInstanceWithDetails.Type)}, 125 {cmd.UI.TranslateText("tags:"), serviceInstanceWithDetails.Tags.String()}, 126 {cmd.UI.TranslateText("route service url:"), serviceInstanceWithDetails.RouteServiceURL.String()}, 127 {cmd.UI.TranslateText("syslog drain url:"), serviceInstanceWithDetails.SyslogDrainURL.String()}, 128 } 129 130 cmd.UI.DisplayKeyValueTable("", table, ui.DefaultTableSpacePadding) 131 cmd.UI.DisplayNewline() 132 } 133 134 func (cmd ServiceCommand) displayPropertiesManaged(serviceInstanceWithDetails v7action.ServiceInstanceDetails) { 135 table := [][]string{ 136 {cmd.UI.TranslateText("name:"), serviceInstanceWithDetails.Name}, 137 {cmd.UI.TranslateText("guid:"), serviceInstanceWithDetails.GUID}, 138 {cmd.UI.TranslateText("type:"), string(serviceInstanceWithDetails.Type)}, 139 {cmd.UI.TranslateText("broker:"), serviceInstanceWithDetails.ServiceBrokerName}, 140 {cmd.UI.TranslateText("offering:"), serviceInstanceWithDetails.ServiceOffering.Name}, 141 {cmd.UI.TranslateText("plan:"), serviceInstanceWithDetails.ServicePlan.Name}, 142 {cmd.UI.TranslateText("tags:"), serviceInstanceWithDetails.Tags.String()}, 143 {cmd.UI.TranslateText("offering tags:"), serviceInstanceWithDetails.ServiceOffering.Tags.String()}, 144 {cmd.UI.TranslateText("description:"), serviceInstanceWithDetails.ServiceOffering.Description}, 145 {cmd.UI.TranslateText("documentation:"), serviceInstanceWithDetails.ServiceOffering.DocumentationURL}, 146 {cmd.UI.TranslateText("dashboard url:"), serviceInstanceWithDetails.DashboardURL.String()}, 147 } 148 cmd.UI.DisplayKeyValueTable("", table, ui.DefaultTableSpacePadding) 149 cmd.UI.DisplayNewline() 150 } 151 152 func (cmd ServiceCommand) displaySharingInfo(serviceInstanceWithDetails v7action.ServiceInstanceDetails) { 153 cmd.UI.DisplayText("Showing sharing info:") 154 155 if serviceInstanceWithDetails.SharedStatus.IsSharedFromOriginalSpace { 156 cmd.UI.DisplayTextWithFlavor(indent+"This service instance is shared from space {{.Space}} of org {{.Org}}.", map[string]interface{}{ 157 "Space": serviceInstanceWithDetails.SpaceName, 158 "Org": serviceInstanceWithDetails.OrganizationName, 159 }) 160 cmd.UI.DisplayNewline() 161 return 162 } 163 164 if serviceInstanceWithDetails.SharedStatus.IsSharedToOtherSpaces { 165 cmd.UI.DisplayText(indent + "Shared with spaces:") 166 cmd.displaySharedTo(serviceInstanceWithDetails) 167 cmd.UI.DisplayNewline() 168 } else { 169 cmd.UI.DisplayText(indent + "This service instance is not currently being shared.") 170 cmd.UI.DisplayNewline() 171 } 172 173 if serviceInstanceWithDetails.SharedStatus.FeatureFlagIsDisabled || serviceInstanceWithDetails.SharedStatus.OfferingDisablesSharing { 174 if serviceInstanceWithDetails.SharedStatus.FeatureFlagIsDisabled { 175 cmd.UI.DisplayText(indent + `The "service_instance_sharing" feature flag is disabled for this Cloud Foundry platform.`) 176 } 177 178 if serviceInstanceWithDetails.SharedStatus.OfferingDisablesSharing { 179 cmd.UI.DisplayText(indent + "Service instance sharing is disabled for this service offering.") 180 } 181 cmd.UI.DisplayNewline() 182 } 183 } 184 185 func (cmd ServiceCommand) displayLastOperation(serviceInstanceWithDetails v7action.ServiceInstanceDetails) { 186 cmd.UI.DisplayText("Showing status of last operation:") 187 188 if serviceInstanceWithDetails.LastOperation == (resources.LastOperation{}) { 189 cmd.UI.DisplayText(indent + "There is no last operation available for this service instance.") 190 } else { 191 status := fmt.Sprintf("%s %s", serviceInstanceWithDetails.LastOperation.Type, serviceInstanceWithDetails.LastOperation.State) 192 table := [][]string{ 193 {cmd.UI.TranslateText("status:"), status}, 194 {cmd.UI.TranslateText("message:"), serviceInstanceWithDetails.LastOperation.Description}, 195 {cmd.UI.TranslateText("started:"), serviceInstanceWithDetails.LastOperation.CreatedAt}, 196 {cmd.UI.TranslateText("updated:"), serviceInstanceWithDetails.LastOperation.UpdatedAt}, 197 } 198 cmd.UI.DisplayKeyValueTable(indent, table, ui.DefaultTableSpacePadding) 199 } 200 201 cmd.UI.DisplayNewline() 202 } 203 204 func (cmd ServiceCommand) displayUpgrades(serviceInstanceWithDetails v7action.ServiceInstanceDetails) { 205 cmd.UI.DisplayText("Showing upgrade status:") 206 207 switch serviceInstanceWithDetails.UpgradeStatus.State { 208 case v7action.ServiceInstanceUpgradeAvailable: 209 cmd.UI.DisplayText(indent + "There is an upgrade available for this service.") 210 cmd.UI.DisplayNewline() 211 cmd.UI.DisplayText(indent+"Upgrade description: {{.Description}}", map[string]interface{}{ 212 "Description": serviceInstanceWithDetails.UpgradeStatus.Description, 213 }) 214 cmd.UI.DisplayText(indent+"TIP: You can upgrade using 'cf upgrade-service {{.InstanceName}}'", map[string]interface{}{ 215 "InstanceName": serviceInstanceWithDetails.Name, 216 }) 217 case v7action.ServiceInstanceUpgradeNotAvailable: 218 cmd.UI.DisplayText(indent + "There is no upgrade available for this service.") 219 default: 220 cmd.UI.DisplayText(indent + "Upgrades are not supported by this broker.") 221 } 222 223 cmd.UI.DisplayNewline() 224 } 225 226 func (cmd ServiceCommand) displaySharedTo(serviceInstanceWithDetails v7action.ServiceInstanceDetails) { 227 table := [][]string{{"org", "space", "bindings"}} 228 for _, usageSummaryLine := range serviceInstanceWithDetails.SharedStatus.UsageSummary { 229 table = append(table, []string{usageSummaryLine.OrganizationName, usageSummaryLine.SpaceName, strconv.Itoa(usageSummaryLine.BoundAppCount)}) 230 } 231 cmd.UI.DisplayTableWithHeader(indent, table, ui.DefaultTableSpacePadding) 232 } 233 234 func (cmd ServiceCommand) displayBoundApps(serviceInstanceWithDetails v7action.ServiceInstanceDetails) { 235 cmd.UI.DisplayText("Showing bound apps:") 236 237 if len(serviceInstanceWithDetails.BoundApps) == 0 { 238 cmd.UI.DisplayText(indent + "There are no bound apps for this service instance.") 239 cmd.UI.DisplayNewline() 240 return 241 } 242 243 table := [][]string{{"name", "binding name", "status", "message"}} 244 for _, app := range serviceInstanceWithDetails.BoundApps { 245 table = append(table, []string{ 246 app.AppName, 247 app.Name, 248 fmt.Sprintf("%s %s", app.LastOperation.Type, app.LastOperation.State), 249 app.LastOperation.Description, 250 }) 251 } 252 253 cmd.UI.DisplayTableWithHeader(indent, table, ui.DefaultTableSpacePadding) 254 cmd.UI.DisplayNewline() 255 }