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  }