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 }