github.com/mook-as/cf-cli@v7.0.0-beta.28.0.20200120190804-b91c115fae48+incompatible/plugin/v7/rpc/cli_rpc_command.go (about)

     1  // +build V7
     2  
     3  package rpc
     4  
     5  import (
     6  	"bytes"
     7  	"encoding/gob"
     8  	"errors"
     9  	"fmt"
    10  	"io"
    11  	"sync"
    12  
    13  	"code.cloudfoundry.org/cli/command"
    14  	plugin "code.cloudfoundry.org/cli/plugin/v7"
    15  	plugin_models "code.cloudfoundry.org/cli/plugin/v7/models"
    16  	"code.cloudfoundry.org/cli/version"
    17  	"github.com/blang/semver"
    18  )
    19  
    20  type CliRpcCmd struct {
    21  	PluginMetadata       *plugin.PluginMetadata
    22  	MetadataMutex        *sync.RWMutex
    23  	Config               command.Config
    24  	PluginActor          PluginActor
    25  	outputCapture        OutputCapture
    26  	terminalOutputSwitch TerminalOutputSwitch
    27  	outputBucket         *bytes.Buffer
    28  	stdout               io.Writer
    29  }
    30  
    31  func (cmd *CliRpcCmd) ApiEndpoint(args string, retVal *string) error {
    32  	*retVal = cmd.Config.Target()
    33  
    34  	return nil
    35  }
    36  
    37  func (cmd *CliRpcCmd) IsMinCliVersion(passedVersion string, retVal *bool) error {
    38  	if version.VersionString() == version.DefaultVersion {
    39  		*retVal = true
    40  		return nil
    41  	}
    42  
    43  	actualVersion, err := semver.Make(version.VersionString())
    44  	if err != nil {
    45  		return err
    46  	}
    47  
    48  	requiredVersion, err := semver.Make(passedVersion)
    49  	if err != nil {
    50  		return err
    51  	}
    52  
    53  	*retVal = actualVersion.GTE(requiredVersion)
    54  
    55  	return nil
    56  }
    57  
    58  func (cmd *CliRpcCmd) SetPluginMetadata(pluginMetadata plugin.PluginMetadata, retVal *bool) error {
    59  	cmd.MetadataMutex.Lock()
    60  	defer cmd.MetadataMutex.Unlock()
    61  
    62  	cmd.PluginMetadata = &pluginMetadata
    63  	*retVal = true
    64  	return nil
    65  }
    66  
    67  func (cmd *CliRpcCmd) DisableTerminalOutput(disable bool, retVal *bool) error {
    68  	cmd.terminalOutputSwitch.DisableTerminalOutput(disable)
    69  	*retVal = true
    70  	return nil
    71  }
    72  
    73  func (cmd *CliRpcCmd) CallCoreCommand(args []string, retVal *bool) error {
    74  	return errors.New("unimplemented")
    75  }
    76  
    77  func (cmd *CliRpcCmd) GetOutputAndReset(args bool, retVal *[]string) error {
    78  	return errors.New("unimplemented")
    79  }
    80  
    81  func (cmd *CliRpcCmd) GetApp(appName string, retVal *plugin_models.DetailedApplicationSummary) error {
    82  	spaceGUID := cmd.Config.TargetedSpace().GUID
    83  	app, _, err := cmd.PluginActor.GetDetailedAppSummary(appName, spaceGUID, true)
    84  
    85  	if err != nil {
    86  		return err
    87  	}
    88  	var b bytes.Buffer
    89  	enc := gob.NewEncoder(&b)
    90  	dec := gob.NewDecoder(&b)
    91  
    92  	err = enc.Encode(app)
    93  	if err != nil {
    94  		panic(err)
    95  	}
    96  
    97  	err = dec.Decode(retVal)
    98  	if err != nil {
    99  		panic(err)
   100  	}
   101  	return nil
   102  }
   103  
   104  func (cmd *CliRpcCmd) GetApps(appName string, retVal *[]plugin_models.Application) error {
   105  	spaceGUID := cmd.Config.TargetedSpace().GUID
   106  	if spaceGUID == "" {
   107  		return errors.New("no space targeted")
   108  	}
   109  	applications, warnings, err := cmd.PluginActor.GetApplicationsBySpace(spaceGUID)
   110  	if err != nil {
   111  		return err
   112  	}
   113  	for _, warning := range warnings {
   114  		fmt.Printf("GetApps warning: %s\n", warning)
   115  	}
   116  	var b bytes.Buffer
   117  	enc := gob.NewEncoder(&b)
   118  	dec := gob.NewDecoder(&b)
   119  
   120  	err = enc.Encode(applications)
   121  	if err != nil {
   122  		panic(err)
   123  	}
   124  
   125  	err = dec.Decode(retVal)
   126  	if err != nil {
   127  		panic(err)
   128  	}
   129  	return nil
   130  }
   131  
   132  func (cmd *CliRpcCmd) GetCurrentOrg(args string, retVal *plugin_models.Org) error {
   133  	org := cmd.Config.TargetedOrganization()
   134  	if org.Name == "" {
   135  		return errors.New("no organization targeted")
   136  	}
   137  
   138  	var b bytes.Buffer
   139  	enc := gob.NewEncoder(&b)
   140  	dec := gob.NewDecoder(&b)
   141  
   142  	err := enc.Encode(org)
   143  	if err != nil {
   144  		panic(err)
   145  	}
   146  
   147  	err = dec.Decode(retVal)
   148  	if err != nil {
   149  		panic(err)
   150  	}
   151  	return nil
   152  }
   153  
   154  func (cmd *CliRpcCmd) GetCurrentSpace(args string, retVal *plugin_models.Space) error {
   155  	orgGUID := cmd.Config.TargetedOrganization().GUID
   156  	if orgGUID == "" {
   157  		return errors.New("no organization targeted")
   158  	}
   159  	spaceName := cmd.Config.TargetedSpace().Name
   160  	if spaceName == "" {
   161  		return errors.New("no space targeted")
   162  	}
   163  	space, _, err := cmd.PluginActor.GetSpaceByNameAndOrganization(spaceName, orgGUID)
   164  
   165  	if err != nil {
   166  		return err
   167  	}
   168  	var b bytes.Buffer
   169  	enc := gob.NewEncoder(&b)
   170  	dec := gob.NewDecoder(&b)
   171  
   172  	err = enc.Encode(space)
   173  	if err != nil {
   174  		panic(err)
   175  	}
   176  
   177  	err = dec.Decode(retVal)
   178  	if err != nil {
   179  		panic(err)
   180  	}
   181  	return nil
   182  }
   183  
   184  func (cmd *CliRpcCmd) GetOrg(orgName string, retVal *plugin_models.OrgSummary) error {
   185  	org, _, err := cmd.PluginActor.GetOrganizationByName(orgName)
   186  	if err != nil {
   187  		return err
   188  	}
   189  
   190  	spaces, _, err := cmd.PluginActor.GetOrganizationSpaces(org.GUID)
   191  	if err != nil {
   192  		return err
   193  	}
   194  
   195  	domains, _, err := cmd.PluginActor.GetOrganizationDomains(org.GUID, "")
   196  	if err != nil {
   197  		return err
   198  	}
   199  
   200  	for _, space := range spaces {
   201  		newSpace := plugin_models.Space{
   202  			GUID: space.GUID,
   203  			Name: space.Name,
   204  		}
   205  		retVal.Spaces = append(retVal.Spaces, newSpace)
   206  	}
   207  
   208  	for _, domain := range domains {
   209  		newDomain := plugin_models.Domain{GUID: domain.GUID, Name: domain.Name}
   210  		retVal.Domains = append(retVal.Domains, newDomain)
   211  	}
   212  
   213  	var b bytes.Buffer
   214  	enc := gob.NewEncoder(&b)
   215  	dec := gob.NewDecoder(&b)
   216  
   217  	err = enc.Encode(org.Metadata)
   218  	if err != nil {
   219  		panic(err)
   220  	}
   221  
   222  	var metadata plugin_models.Metadata
   223  
   224  	err = dec.Decode(&metadata)
   225  	if err != nil {
   226  		panic(err)
   227  	}
   228  
   229  	retVal.Name = org.Name
   230  	retVal.GUID = org.GUID
   231  	retVal.Metadata = metadata
   232  
   233  	return nil
   234  }
   235  
   236  func (cmd *CliRpcCmd) IsLoggedIn(args string, retVal *bool) error {
   237  	*retVal = cmd.Config.AccessToken() != ""
   238  	return nil
   239  }
   240  
   241  func (cmd *CliRpcCmd) IsSkipSSLValidation(args string, retVal *bool) error {
   242  	*retVal = cmd.Config.SkipSSLValidation()
   243  	return nil
   244  }
   245  
   246  func (cmd *CliRpcCmd) AccessToken(args string, retVal *string) error {
   247  	accessToken, err := cmd.PluginActor.RefreshAccessToken()
   248  	if err != nil {
   249  		panic(err)
   250  	}
   251  	*retVal = accessToken
   252  	return nil
   253  }
   254  
   255  func (cmd *CliRpcCmd) Username(args string, retVal *string) error {
   256  	username, err := cmd.Config.CurrentUserName()
   257  	if err != nil {
   258  		return fmt.Errorf("error processing config: %s", err.Error())
   259  	}
   260  	if username == "" {
   261  		return errors.New("not logged in")
   262  	}
   263  	*retVal = username
   264  
   265  	return nil
   266  }