X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?p=src%2Fxds%2Fxds-cli.git;a=blobdiff_plain;f=utils.go;h=dc5cb57a29563893751abf45d4453f07a2bbc0aa;hp=6a05ef3e01547dc72d532545c6861f0e117af4e7;hb=3b5e82b55433fd49cfe0cd0349756e0c2e9a9c12;hpb=c35d7a0fc8bbb1f9123bb41a7b66e45ea2564dd2 diff --git a/utils.go b/utils.go index 6a05ef3..dc5cb57 100644 --- a/utils.go +++ b/utils.go @@ -1,35 +1,77 @@ +/* + * Copyright (C) 2017-2018 "IoT.bzh" + * Author Sebastien Douheret + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package main import ( "encoding/json" + "fmt" + "os" + "sort" + "strconv" + "strings" - "github.com/iotbzh/xds-agent/lib/apiv1" + "gerrit.automotivelinux.org/gerrit/src/xds/xds-agent.git/lib/xaapiv1" + "github.com/franciscocpg/reflectme" "github.com/urfave/cli" ) -var cacheXdsVersion *apiv1.XDSVersion +var cacheXdsVersion *xaapiv1.XDSVersion +var cacheData = xaapiv1.XDSVersion{} // XdsVersionGet Get version of XDS agent & server -func XdsVersionGet(ver *apiv1.XDSVersion) error { - // Use cached data - if cacheXdsVersion != nil { - ver = cacheXdsVersion - return nil +func XdsVersionGet(ver *xaapiv1.XDSVersion) error { + // Update cached data + if cacheXdsVersion == nil { + if err := HTTPCli.Get("/version", &cacheData); err != nil { + return err + } } + reflectme.Copy(&cacheData, ver) + return nil +} + +// XdsConfigGet Get current XDS Agent config +func XdsConfigGet(cfg *xaapiv1.APIConfig) error { + return HTTPCli.Get("/config", cfg) +} + +// XdsConfigSet Set XDS Agent config +func XdsConfigSet(cfg xaapiv1.APIConfig) error { + // clear cache + cacheXdsVersion = nil - dataVer := apiv1.XDSVersion{} - if err := HTTPCli.Get("/version", &dataVer); err != nil { + newCfg := xaapiv1.APIConfig{} + if err := HTTPCli.Post("/config", cfg, &newCfg); err != nil { return err } - cacheXdsVersion = &dataVer - *ver = dataVer + idx := XdsServerIndexGet() + if !newCfg.Servers[idx].Connected { + return fmt.Errorf("XDS server %s still not connected", cfg.Servers[idx].URL) + } + return nil } // XdsServerIDGet returns the XDS Server ID func XdsServerIDGet() string { - ver := apiv1.XDSVersion{} + ver := xaapiv1.XDSVersion{} if err := XdsVersionGet(&ver); err != nil { return "" } @@ -45,15 +87,33 @@ func XdsServerIndexGet() int { return 0 } +// XdsServerComputeURL computes the URL used to access to XDS Server API +func XdsServerComputeURL(endURL string) string { + return "servers/" + strconv.Itoa(XdsServerIndexGet()) + endURL +} + +// Sort projects by Label +type _PrjByLabel []xaapiv1.ProjectConfig + +func (s _PrjByLabel) Len() int { return len(s) } +func (s _PrjByLabel) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s _PrjByLabel) Less(i, j int) bool { return s[i].Label < s[j].Label } + // ProjectsListGet Get the list of existing projects -func ProjectsListGet(prjs *[]apiv1.ProjectConfig) error { +func ProjectsListGet(prjs *[]xaapiv1.ProjectConfig) error { var data []byte if err := HTTPCli.HTTPGet("/projects", &data); err != nil { return err } Log.Debugf("Result of /projects: %v", string(data[:])) - return json.Unmarshal(data, &prjs) + if err := json.Unmarshal(data, &prjs); err != nil { + return err + } + + sort.Sort(_PrjByLabel(*prjs)) + + return nil } // LogPost Helper to log a POST request @@ -63,11 +123,42 @@ func LogPost(format string, data interface{}) { } // GetID Return a string ID set with --id option or as simple parameter -func GetID(ctx *cli.Context) string { - id := ctx.String("id") +func GetID(ctx *cli.Context, idEnvVarName string) string { + return GetIDName(ctx, "id", idEnvVarName) +} + +// GetIDName Return a string ID set with --XXX option or as simple parameter +func GetIDName(ctx *cli.Context, idName, idEnvVarName string) string { + if idName == "" { + return "" + } + + // Get id set using option --id + id := ctx.String(idName) + + // Check if id has been set using env variable + envSdkid, _ := os.LookupEnv(idEnvVarName) + + // Support as 1st arg without --id option string (for example xds-cli sdk install 123456) idArgs := ctx.Args().First() - if id == "" && idArgs != "" { + + // Set or overwrite id using first arg (knowing that 1st is overwrite env variable) + if (id == "" && idArgs != "") || (envSdkid != "" && idArgs != "") { id = idArgs } return id } + +// Confirm Return true when user answer 'y' or 'yes' to a question +func Confirm(question string) bool { + var answer string + fmt.Print(question) + fmt.Scanln(&answer) + ans := strings.ToLower(strings.TrimSpace(answer)) + return (ans == "y" || ans == "yes") +} + +// compareID Compare an ID to a reference ID +func compareID(refID, ID string) bool { + return refID != "" && ID != "" && strings.HasPrefix(refID, ID) +}