github.com/franc20/ayesa_sap@v7.0.0-beta.28.0.20200124003224-302d4d52fa6c+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  	if !cmd.Config.HasTargetedOrganization() {
    83  		return errors.New("no organization targeted")
    84  	}
    85  	spaceGUID := cmd.Config.TargetedSpace().GUID
    86  	if spaceGUID == "" {
    87  		return errors.New("no space targeted")
    88  	}
    89  
    90  	app, _, err := cmd.PluginActor.GetDetailedAppSummary(appName, spaceGUID, true)
    91  
    92  	if err != nil {
    93  		return err
    94  	}
    95  	var b bytes.Buffer
    96  	enc := gob.NewEncoder(&b)
    97  	dec := gob.NewDecoder(&b)
    98  
    99  	err = enc.Encode(app)
   100  	if err != nil {
   101  		panic(err)
   102  	}
   103  
   104  	err = dec.Decode(retVal)
   105  	if err != nil {
   106  		panic(err)
   107  	}
   108  	return nil
   109  }
   110  
   111  func (cmd *CliRpcCmd) GetApps(appName string, retVal *[]plugin_models.Application) error {
   112  	spaceGUID := cmd.Config.TargetedSpace().GUID
   113  	if spaceGUID == "" {
   114  		return errors.New("no space targeted")
   115  	}
   116  	applications, warnings, err := cmd.PluginActor.GetApplicationsBySpace(spaceGUID)
   117  	if err != nil {
   118  		return err
   119  	}
   120  	for _, warning := range warnings {
   121  		fmt.Printf("GetApps warning: %s\n", warning)
   122  	}
   123  	var b bytes.Buffer
   124  	enc := gob.NewEncoder(&b)
   125  	dec := gob.NewDecoder(&b)
   126  
   127  	err = enc.Encode(applications)
   128  	if err != nil {
   129  		panic(err)
   130  	}
   131  
   132  	err = dec.Decode(retVal)
   133  	if err != nil {
   134  		panic(err)
   135  	}
   136  	return nil
   137  }
   138  
   139  func (cmd *CliRpcCmd) GetCurrentOrg(args string, retVal *plugin_models.Org) error {
   140  	org := cmd.Config.TargetedOrganization()
   141  	if org.Name == "" {
   142  		return errors.New("no organization targeted")
   143  	}
   144  
   145  	var b bytes.Buffer
   146  	enc := gob.NewEncoder(&b)
   147  	dec := gob.NewDecoder(&b)
   148  
   149  	err := enc.Encode(org)
   150  	if err != nil {
   151  		panic(err)
   152  	}
   153  
   154  	err = dec.Decode(retVal)
   155  	if err != nil {
   156  		panic(err)
   157  	}
   158  	return nil
   159  }
   160  
   161  func (cmd *CliRpcCmd) GetCurrentSpace(args string, retVal *plugin_models.Space) error {
   162  	orgGUID := cmd.Config.TargetedOrganization().GUID
   163  	if orgGUID == "" {
   164  		return errors.New("no organization targeted")
   165  	}
   166  	spaceName := cmd.Config.TargetedSpace().Name
   167  	if spaceName == "" {
   168  		return errors.New("no space targeted")
   169  	}
   170  	space, _, err := cmd.PluginActor.GetSpaceByNameAndOrganization(spaceName, orgGUID)
   171  
   172  	if err != nil {
   173  		return err
   174  	}
   175  	var b bytes.Buffer
   176  	enc := gob.NewEncoder(&b)
   177  	dec := gob.NewDecoder(&b)
   178  
   179  	err = enc.Encode(space)
   180  	if err != nil {
   181  		panic(err)
   182  	}
   183  
   184  	err = dec.Decode(retVal)
   185  	if err != nil {
   186  		panic(err)
   187  	}
   188  	return nil
   189  }
   190  
   191  func (cmd *CliRpcCmd) GetOrg(orgName string, retVal *plugin_models.OrgSummary) error {
   192  	org, _, err := cmd.PluginActor.GetOrganizationByName(orgName)
   193  	if err != nil {
   194  		return err
   195  	}
   196  
   197  	spaces, _, err := cmd.PluginActor.GetOrganizationSpaces(org.GUID)
   198  	if err != nil {
   199  		return err
   200  	}
   201  
   202  	domains, _, err := cmd.PluginActor.GetOrganizationDomains(org.GUID, "")
   203  	if err != nil {
   204  		return err
   205  	}
   206  
   207  	for _, space := range spaces {
   208  		newSpace := plugin_models.Space{
   209  			GUID: space.GUID,
   210  			Name: space.Name,
   211  		}
   212  		retVal.Spaces = append(retVal.Spaces, newSpace)
   213  	}
   214  
   215  	for _, domain := range domains {
   216  		newDomain := plugin_models.Domain{GUID: domain.GUID, Name: domain.Name}
   217  		retVal.Domains = append(retVal.Domains, newDomain)
   218  	}
   219  
   220  	var b bytes.Buffer
   221  	enc := gob.NewEncoder(&b)
   222  	dec := gob.NewDecoder(&b)
   223  
   224  	err = enc.Encode(org.Metadata)
   225  	if err != nil {
   226  		panic(err)
   227  	}
   228  
   229  	var metadata plugin_models.Metadata
   230  
   231  	err = dec.Decode(&metadata)
   232  	if err != nil {
   233  		panic(err)
   234  	}
   235  
   236  	retVal.Name = org.Name
   237  	retVal.GUID = org.GUID
   238  	retVal.Metadata = metadata
   239  
   240  	return nil
   241  }
   242  
   243  func (cmd *CliRpcCmd) GetSpace(spaceName string, retVal *plugin_models.Space) error {
   244  	orgGUID := cmd.Config.TargetedOrganization().GUID
   245  	if orgGUID == "" {
   246  		return errors.New("no organization targeted")
   247  	}
   248  	space, _, err := cmd.PluginActor.GetSpaceByNameAndOrganization(spaceName, orgGUID)
   249  	if err != nil {
   250  		return err
   251  	}
   252  
   253  	var b bytes.Buffer
   254  	enc := gob.NewEncoder(&b)
   255  	dec := gob.NewDecoder(&b)
   256  
   257  	err = enc.Encode(space)
   258  	if err != nil {
   259  		panic(err)
   260  	}
   261  
   262  	err = dec.Decode(retVal)
   263  	if err != nil {
   264  		panic(err)
   265  	}
   266  
   267  	return nil
   268  }
   269  
   270  func (cmd *CliRpcCmd) GetSpaces(not_used string, retVal *[]plugin_models.Space) error {
   271  	orgGUID := cmd.Config.TargetedOrganization().GUID
   272  	if orgGUID == "" {
   273  		return errors.New("no organization targeted")
   274  	}
   275  	spaces, _, err := cmd.PluginActor.GetOrganizationSpaces(orgGUID)
   276  	if err != nil {
   277  		return err
   278  	}
   279  
   280  	var b bytes.Buffer
   281  	enc := gob.NewEncoder(&b)
   282  	dec := gob.NewDecoder(&b)
   283  
   284  	err = enc.Encode(spaces)
   285  	if err != nil {
   286  		return err
   287  	}
   288  
   289  	err = dec.Decode(retVal)
   290  	if err != nil {
   291  		return err
   292  	}
   293  
   294  	return nil
   295  }
   296  
   297  func (cmd *CliRpcCmd) IsLoggedIn(args string, retVal *bool) error {
   298  	*retVal = cmd.Config.AccessToken() != ""
   299  	return nil
   300  }
   301  
   302  func (cmd *CliRpcCmd) IsSkipSSLValidation(args string, retVal *bool) error {
   303  	*retVal = cmd.Config.SkipSSLValidation()
   304  	return nil
   305  }
   306  
   307  func (cmd *CliRpcCmd) AccessToken(args string, retVal *string) error {
   308  	accessToken, err := cmd.PluginActor.RefreshAccessToken()
   309  	if err != nil {
   310  		panic(err)
   311  	}
   312  	*retVal = accessToken
   313  	return nil
   314  }
   315  
   316  func (cmd *CliRpcCmd) Username(args string, retVal *string) error {
   317  	username, err := cmd.Config.CurrentUserName()
   318  	if err != nil {
   319  		return fmt.Errorf("error processing config: %s", err.Error())
   320  	}
   321  	if username == "" {
   322  		return errors.New("not logged in")
   323  	}
   324  	*retVal = username
   325  
   326  	return nil
   327  }