diff --git a/README.md b/README.md index 2eb6ca9..882d43f 100644 --- a/README.md +++ b/README.md @@ -139,6 +139,9 @@ $ pi --user=user2 --region=gcp-us-central1 info //use specified user and server $ pi --server=https://gcp-us-central1.hyper.sh:443 --user=user3 info + +//change default zone +$ pi config set-default-zone user3 --region=gcp-us-central1 --zone=gcp-us-central1-b ``` @@ -556,6 +559,20 @@ nginx-data gcp-us-central1-a 1 2018-04-27T15:24:31+00:00 nginx-with-v ## pod operation +### pod create + +> create pod via command line + +``` +$ pi create pod busybox --image=busybox + +//specify pod size +$ pi create pod busybox --image=busybox --size=s1 + +//specify zone to run pod +$ pi create pod busybox --image=busybox --zone=gcp-us-central1-b +``` + ### pod exec > exec command in running pod diff --git a/examples/pod/pod-with-zone.yaml b/examples/pod/pod-with-zone.yaml index 1312df8..90fef9a 100644 --- a/examples/pod/pod-with-zone.yaml +++ b/examples/pod/pod-with-zone.yaml @@ -7,4 +7,4 @@ spec: - name: busybox image: busybox nodeSelector: - zone: gcp-us-central1-a + zone: gcp-us-central1-b diff --git a/pkg/pi/cmd/cmd.go b/pkg/pi/cmd/cmd.go index 445e01e..f1eb1ee 100644 --- a/pkg/pi/cmd/cmd.go +++ b/pkg/pi/cmd/cmd.go @@ -178,10 +178,10 @@ __custom_func() { var ( bash_completion_flags = map[string]string{ - //"namespace": "__pi_get_resource_namespace", - //"context": "__pi_config_get_contexts", - //"cluster": "__pi_config_get_clusters", - //"user": "__pi_config_get_users", + //"namespace": "__pi_get_resource_namespace", + //"context": "__pi_config_get_contexts", + //"cluster": "__pi_config_get_clusters", + //"user": "__pi_config_get_users", } ) @@ -257,7 +257,7 @@ func NewPiCommand(f cmdutil.Factory, in io.Reader, out, err io.Writer) *cobra.Co cmds.AddCommand(NewCmdOptions(out)) cmds.AddCommand(NewCmdInfo(f, out, err)) - cmds.AddCommand(cmdconfig.NewCmdConfig(clientcmd.NewDefaultPathOptions(), out, err)) + cmds.AddCommand(cmdconfig.NewCmdConfig(clientcmd.NewDefaultPathOptions(), out, err, f)) return cmds } diff --git a/pkg/pi/cmd/config/config.go b/pkg/pi/cmd/config/config.go index 0a48e36..830f488 100644 --- a/pkg/pi/cmd/config/config.go +++ b/pkg/pi/cmd/config/config.go @@ -31,7 +31,7 @@ import ( ) // NewCmdConfig creates a command object for the "config" action, and adds all child commands to it. -func NewCmdConfig(pathOptions *clientcmd.PathOptions, out, errOut io.Writer) *cobra.Command { +func NewCmdConfig(pathOptions *clientcmd.PathOptions, out, errOut io.Writer, f cmdutil.Factory) *cobra.Command { if len(pathOptions.ExplicitFileFlag) == 0 { pathOptions.ExplicitFileFlag = clientcmd.RecommendedConfigPathFlag } @@ -75,6 +75,9 @@ func NewCmdConfig(pathOptions *clientcmd.PathOptions, out, errOut io.Writer) *co //cmd.AddCommand(NewCmdConfigDeleteContext(out, errOut, pathOptions)) //cmd.AddCommand(NewCmdConfigRenameContext(out, pathOptions)) cmd.AddCommand(NewCmdConfigDeleteAuthInfo(out, errOut, pathOptions)) + + cmd.AddCommand(NewCmdConfigSetDefaultZone(f, out, pathOptions)) + return cmd } diff --git a/pkg/pi/cmd/config/set_defaultzone.go b/pkg/pi/cmd/config/set_defaultzone.go new file mode 100644 index 0000000..ac8478e --- /dev/null +++ b/pkg/pi/cmd/config/set_defaultzone.go @@ -0,0 +1,376 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 config + +import ( + "errors" + "fmt" + "io" + "io/ioutil" + "net/http" + "path/filepath" + "strings" + + "github.com/hyperhq/client-go/tools/clientcmd" + clientcmdapi "github.com/hyperhq/client-go/tools/clientcmd/api" + "github.com/hyperhq/client-go/tools/clientcmd/api/hyper" + "github.com/hyperhq/pi/pkg/pi/cmd/templates" + cmdutil "github.com/hyperhq/pi/pkg/pi/cmd/util" + "github.com/hyperhq/pi/pkg/pi/util/i18n" + + "github.com/golang/glog" + restclient "github.com/hyperhq/client-go/rest" + "github.com/spf13/cobra" + "k8s.io/apiserver/pkg/util/flag" +) + +type setDefaultZoneOptions struct { + configAccess clientcmd.ConfigAccess + name string + authPath flag.StringFlag + clientCertificate flag.StringFlag + clientKey flag.StringFlag + token flag.StringFlag + username flag.StringFlag + password flag.StringFlag + embedCertData flag.Tristate + authProvider flag.StringFlag + + authProviderArgs map[string]string + authProviderArgsToRemove []string + + server flag.StringFlag + region flag.StringFlag + zone flag.StringFlag +} + +var ( + FlagZone = "zone" + + set_defaultzone_long = fmt.Sprintf(templates.LongDesc(` + Change default zone of user + + Specifying a name that already exists will merge new fields on top of existing values. + + APIServer flags: + --%v=server + + Region flags: + --%v=region + + DefaultZone flags: + --%v=zone + + `), clientcmd.FlagAPIServer, clientcmd.FlagRegion, FlagZone) + + set_defaultzone_example = templates.Examples(` + # Change default zone of user + pi config set-default-zone user1 --region=gcp-us-central1 --zone=gcp-us-central1-c`) +) + +func NewCmdConfigSetDefaultZone(f cmdutil.Factory, out io.Writer, configAccess clientcmd.ConfigAccess) *cobra.Command { + options := &setDefaultZoneOptions{configAccess: configAccess} + return newCmdConfigSetDefaultZone(f, out, options) +} + +func newCmdConfigSetDefaultZone(f cmdutil.Factory, out io.Writer, options *setDefaultZoneOptions) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("set-default-zone NAME [--%v=region] [--%v=zone] ", clientcmd.FlagRegion, FlagZone), + Short: i18n.T("Change default zone of user"), + Long: set_defaultzone_long, + Example: set_defaultzone_example, + Run: func(cmd *cobra.Command, args []string) { + err := options.complete(cmd, out) + if err != nil { + cmd.Help() + cmdutil.CheckErr(err) + } + cmdutil.CheckErr(options.run(f)) + fmt.Fprintf(out, "Change default zone of user %q to %q.\n", options.name, options.zone) + }, + } + + cmd.Flags().Var(&options.server, clientcmd.FlagAPIServer, "apiserver url") + cmd.Flags().Var(&options.region, clientcmd.FlagRegion, "region for the user") + cmd.Flags().Var(&options.zone, FlagZone, "default zone for the user") + + return cmd +} + +func (o setDefaultZoneOptions) run(f cmdutil.Factory) error { + err := o.validate() + if err != nil { + return err + } + + config, err := o.configAccess.GetStartingConfig() + if err != nil { + return err + } + + //default cluster info + startingStanzaCluster, exists := config.Clusters[clientcmd.DefaultCluster] + if !exists { + startingStanzaCluster = clientcmdapi.NewCluster() + cluster := o.modifyDefaultCluster(*startingStanzaCluster) + config.Clusters[clientcmd.DefaultCluster] = &cluster + } + + //default context + startingStanzaContext, exists := config.Contexts[clientcmd.DefaultContext] + if !exists { + startingStanzaContext = clientcmdapi.NewContext() + context := o.modifyDefaultContext(o.name, *startingStanzaContext) + config.Contexts[clientcmd.DefaultContext] = &context + } + + //default auth info + startingStanzaAuth, exists := config.AuthInfos[o.name] + if !exists { + startingStanzaAuth = clientcmdapi.NewAuthInfo() + } + authInfo := o.modifyAuthInfo(*startingStanzaAuth) + config.AuthInfos[o.name] = &authInfo + + if config.CurrentContext == "" { + config.CurrentContext = "default" + } + + if o.zone.String() == "" { + return fmt.Errorf("zone can not be empty") + } + + if o.region.String() == "" { + o.region.Set(config.AuthInfos[o.name].Region) + } + if o.region.String() == "" { + return fmt.Errorf("region can not be empty") + } + + if o.server.String() == "" { + o.server.Set(startingStanzaCluster.Server) + } + if o.server.String() == "" { + return fmt.Errorf("server can not be empty") + } + + glog.V(4).Infof("%v %v %v %v\n", o.server, o.name, o.region, o.zone) + glog.V(4).Infof("%v %v\n", authInfo.AccessKey, authInfo.SecretKey) + + var cfg = &restclient.Config{ + Host: o.server.String(), + CredentialConfig: restclient.CredentialConfig{ + Region: o.region.String(), + AccessKey: authInfo.AccessKey, + SecretKey: authInfo.SecretKey, + }, + } + return o.updateDefaultZone(f, cfg, o.zone.String()) +} + +func (o *setDefaultZoneOptions) updateDefaultZone(f cmdutil.Factory, cfg *restclient.Config, zone string) error { + var tenant string + hyperConn := hyper.NewHyperConn(cfg) + infoCli := hyper.NewInfoCli(hyperConn) + if _, info, err := infoCli.GetInfo(); err != nil { + return fmt.Errorf("failed to get tenant id for user, error:%v", err) + } else { + tenant = info["TenantID"] + } + if tenant == "" { + return fmt.Errorf("missing tenant id") + } + userCli := hyper.NewUserCli(hyperConn) + if httpStatus, err := userCli.UpdateDefaultZone(tenant, zone); err != nil { + return err + } else { + if httpStatus != http.StatusOK { + return fmt.Errorf("failed to update defautl zone, httpstatus=%v", httpStatus) + } + } + return nil +} + +// cluster builds a Cluster object from the options +func (o *setDefaultZoneOptions) modifyDefaultCluster(existingCluster clientcmdapi.Cluster) clientcmdapi.Cluster { + modifiedCluster := existingCluster + + if modifiedCluster.Server == "" { + modifiedCluster.Server = clientcmd.DefaultServer + } + + modifiedCluster.InsecureSkipTLSVerify = true + + return modifiedCluster +} + +func (o *setDefaultZoneOptions) modifyDefaultContext(user string, existingContext clientcmdapi.Context) clientcmdapi.Context { + modifiedContext := existingContext + + modifiedContext.Cluster = clientcmd.DefaultCluster + modifiedContext.AuthInfo = user + modifiedContext.Namespace = "default" + + return modifiedContext +} + +// authInfo builds an AuthInfo object from the options +func (o *setDefaultZoneOptions) modifyAuthInfo(existingAuthInfo clientcmdapi.AuthInfo) clientcmdapi.AuthInfo { + modifiedAuthInfo := existingAuthInfo + + var setToken, setBasic, setCredential bool + + if o.clientCertificate.Provided() { + certPath := o.clientCertificate.Value() + if o.embedCertData.Value() { + modifiedAuthInfo.ClientCertificateData, _ = ioutil.ReadFile(certPath) + modifiedAuthInfo.ClientCertificate = "" + } else { + certPath, _ = filepath.Abs(certPath) + modifiedAuthInfo.ClientCertificate = certPath + if len(modifiedAuthInfo.ClientCertificate) > 0 { + modifiedAuthInfo.ClientCertificateData = nil + } + } + } + if o.clientKey.Provided() { + keyPath := o.clientKey.Value() + if o.embedCertData.Value() { + modifiedAuthInfo.ClientKeyData, _ = ioutil.ReadFile(keyPath) + modifiedAuthInfo.ClientKey = "" + } else { + keyPath, _ = filepath.Abs(keyPath) + modifiedAuthInfo.ClientKey = keyPath + if len(modifiedAuthInfo.ClientKey) > 0 { + modifiedAuthInfo.ClientKeyData = nil + } + } + } + + if o.token.Provided() { + modifiedAuthInfo.Token = o.token.Value() + setToken = len(modifiedAuthInfo.Token) > 0 + } + + if o.username.Provided() { + modifiedAuthInfo.Username = o.username.Value() + setBasic = setBasic || len(modifiedAuthInfo.Username) > 0 + } + if o.password.Provided() { + modifiedAuthInfo.Password = o.password.Value() + setBasic = setBasic || len(modifiedAuthInfo.Password) > 0 + } + if o.authProvider.Provided() { + newName := o.authProvider.Value() + + // Only overwrite if the existing auth-provider is nil, or different than the newly specified one. + if modifiedAuthInfo.AuthProvider == nil || modifiedAuthInfo.AuthProvider.Name != newName { + modifiedAuthInfo.AuthProvider = &clientcmdapi.AuthProviderConfig{ + Name: newName, + } + } + } + + //patch for hyper + if o.region.Provided() { + modifiedAuthInfo.Region = o.region.Value() + setCredential = setCredential || len(modifiedAuthInfo.Region) > 0 + } else { + modifiedAuthInfo.Region = clientcmd.DefaultRegion + setCredential = setCredential || len(modifiedAuthInfo.Region) > 0 + } + + if modifiedAuthInfo.AuthProvider != nil { + if modifiedAuthInfo.AuthProvider.Config == nil { + modifiedAuthInfo.AuthProvider.Config = make(map[string]string) + } + for _, toRemove := range o.authProviderArgsToRemove { + delete(modifiedAuthInfo.AuthProvider.Config, toRemove) + } + for key, value := range o.authProviderArgs { + modifiedAuthInfo.AuthProvider.Config[key] = value + } + } + + // If any auth info was set, make sure any other existing auth types are cleared + if setToken || setBasic || setCredential { + if !setToken { + modifiedAuthInfo.Token = "" + } + if !setBasic { + modifiedAuthInfo.Username = "" + modifiedAuthInfo.Password = "" + } + if !setCredential { + modifiedAuthInfo.Region = "" + modifiedAuthInfo.AccessKey = "" + modifiedAuthInfo.SecretKey = "" + } + } + + glog.V(4).Infof("new: %v existingAuthInfo: %v(%v/%v) modifiedAuthInfo: %v(%v/%v)", + o.region, + existingAuthInfo.Region, existingAuthInfo.AccessKey, existingAuthInfo.SecretKey, + modifiedAuthInfo.Region, modifiedAuthInfo.AccessKey, modifiedAuthInfo.SecretKey) + + return modifiedAuthInfo +} + +func (o *setDefaultZoneOptions) complete(cmd *cobra.Command, out io.Writer) error { + args := cmd.Flags().Args() + if len(args) != 1 { + return fmt.Errorf("please specify the NAME") + } + + o.name = args[0] + return nil +} + +func (o setDefaultZoneOptions) validate() error { + if len(o.name) == 0 { + return errors.New("you must specify a non-empty user name") + } + methods := []string{} + if len(o.token.Value()) > 0 { + methods = append(methods, fmt.Sprintf("--%v", clientcmd.FlagBearerToken)) + } + if len(o.username.Value()) > 0 || len(o.password.Value()) > 0 { + methods = append(methods, fmt.Sprintf("--%v/--%v", clientcmd.FlagUsername, clientcmd.FlagPassword)) + } + if len(methods) > 1 { + return fmt.Errorf("you cannot specify more than one authentication method at the same time: %v", strings.Join(methods, ", ")) + } + if o.embedCertData.Value() { + certPath := o.clientCertificate.Value() + keyPath := o.clientKey.Value() + if certPath == "" && keyPath == "" { + return fmt.Errorf("you must specify a --%s or --%s to embed", clientcmd.FlagCertFile, clientcmd.FlagKeyFile) + } + if certPath != "" { + if _, err := ioutil.ReadFile(certPath); err != nil { + return fmt.Errorf("error reading %s data from %s: %v", clientcmd.FlagCertFile, certPath, err) + } + } + if keyPath != "" { + if _, err := ioutil.ReadFile(keyPath); err != nil { + return fmt.Errorf("error reading %s data from %s: %v", clientcmd.FlagKeyFile, keyPath, err) + } + } + } + + return nil +} diff --git a/pkg/pi/cmd/create_job.go b/pkg/pi/cmd/create_job.go index 44f6811..2b00e16 100644 --- a/pkg/pi/cmd/create_job.go +++ b/pkg/pi/cmd/create_job.go @@ -102,6 +102,7 @@ func addCreateJobFlags(cmd *cobra.Command) { cmd.Flags().StringP("image-pull-secrets", "", "", i18n.T("The secret for the private docker registry, comma separated.")) cmd.Flags().StringP("active-deadline-seconds", "", "", i18n.T("Optional duration in seconds the pod may be active on the node relative to StartTime before the system will actively try to mark it failed and kill associated containers. Value must be a positive integer.")) cmd.Flags().StringP("size", "", "s4", i18n.T("The size for the pod (e.g. s1, s2, s3, s4, m1, m2, m3, l1, l2, l3, l4, l5, l6), you can not use --limits together with --size")) + cmd.Flags().StringP("zone", "", "", i18n.T("zone to run pod, default zone will be used if not specified, use 'pi info' to view the zone info")) cmd.Flags().StringArray("volume", []string{}, "Pod volumes to mount into the container's filesystem. format ':'") } @@ -164,6 +165,7 @@ func RunJobRun(f cmdutil.Factory, cmdOut, cmdErr io.Writer, cmd *cobra.Command, if params["size"] != "" && params["limits"] != "" { return cmdutil.UsageErrorf(cmd, "--size and --limits can not be used together") } + params["zone"] = cmdutil.GetFlagString(cmd, "zone") params["volume"] = cmdutil.GetFlagStringArray(cmd, "volume") params["completions"] = cmdutil.GetFlagString(cmd, "completions") diff --git a/pkg/pi/cmd/run.go b/pkg/pi/cmd/run.go index 87beced..1acb219 100644 --- a/pkg/pi/cmd/run.go +++ b/pkg/pi/cmd/run.go @@ -129,7 +129,8 @@ func AddRunFlags(cmd *cobra.Command) { //cmd.Flags().String("schedule", "", i18n.T("A schedule in the Cron format the job should be run with.")) cmd.Flags().StringP("image-pull-secrets", "", "", i18n.T("The secret for the private docker registry, comma separated.")) cmd.Flags().StringP("active-deadline-seconds", "", "", i18n.T("Optional duration in seconds the pod may be active on the node relative to StartTime before the system will actively try to mark it failed and kill associated containers. Value must be a positive integer.")) - cmd.Flags().StringP("size", "", "s4", i18n.T("The size for the pod (e.g. s1, s2, s3, s4, m1, m2, m3, l1, l2, l3, l4, l5, l6)")) + cmd.Flags().StringP("size", "", "s4", i18n.T("The size for the pod (e.g. s1, s2, s3, s4, m1, m2, m3, l1, l2, l3, l4, l5, l6), you can not use --limits together with --size")) + cmd.Flags().StringP("zone", "", "", i18n.T("zone to run pod, default zone will be used if not specified, use 'pi info' to view the zone info")) cmd.Flags().StringArray("volume", []string{}, "Pod volumes to mount into the container's filesystem. format ':'") } @@ -271,6 +272,7 @@ func RunRun(f cmdutil.Factory, cmdIn io.Reader, cmdOut, cmdErr io.Writer, cmd *c if params["size"] != "" && params["limits"] != "" { return cmdutil.UsageErrorf(cmd, "--size and --limits can not be used together") } + params["zone"] = cmdutil.GetFlagString(cmd, "zone") params["env"] = cmdutil.GetFlagStringArray(cmd, "env") params["image-pull-secrets"] = cmdutil.GetFlagString(cmd, "image-pull-secrets") diff --git a/pkg/pi/run.go b/pkg/pi/run.go index ad7cdfb..8c45308 100644 --- a/pkg/pi/run.go +++ b/pkg/pi/run.go @@ -343,6 +343,7 @@ func (JobV1) ParamNames() []GeneratorParam { {"restart", false}, {"serviceaccount", false}, {"size", false}, + {"zone", false}, {"completions", false}, {"parallelism", false}, {"backoff-limit", false}, @@ -442,6 +443,14 @@ func (JobV1) Generate(genericParams map[string]interface{}) (runtime.Object, err } job.ObjectMeta.Annotations["sh_hyper_instancetype"] = params["size"] } + + if zone, ok := params["zone"]; ok && zone != "" { + if job.Spec.Template.Spec.NodeSelector == nil { + job.Spec.Template.Spec.NodeSelector = map[string]string{} + } + job.Spec.Template.Spec.NodeSelector["zone"] = params["zone"] + } + if params["completions"] != "" { if i, err := strconv.ParseInt(params["completions"], 10, 32); err != nil { return nil, fmt.Errorf("--completions should be a integer") @@ -954,6 +963,7 @@ func (BasicPod) ParamNames() []GeneratorParam { {"image-pull-secrets", false}, {"active-deadline-seconds", false}, {"size", false}, + {"zone", false}, {"volume", false}, } } @@ -1023,9 +1033,6 @@ func (BasicPod) Generate(genericParams map[string]interface{}) (runtime.Object, ObjectMeta: metav1.ObjectMeta{ Name: name, Labels: labels, - Annotations: map[string]string{ - "sh_hyper_instancetype": params["size"], - }, }, Spec: v1.PodSpec{ ServiceAccountName: params["serviceaccount"], @@ -1044,6 +1051,21 @@ func (BasicPod) Generate(genericParams map[string]interface{}) (runtime.Object, RestartPolicy: restartPolicy, }, } + + if _, ok := params["size"]; ok { + if pod.Annotations == nil { + pod.Annotations = map[string]string{} + } + pod.Annotations["sh_hyper_instancetype"] = params["size"] + } + + if zone, ok := params["zone"]; ok && zone != "" { + if pod.Spec.NodeSelector == nil { + pod.Spec.NodeSelector = map[string]string{} + } + pod.Spec.NodeSelector["zone"] = params["zone"] + } + imagePullPolicy := v1.PullPolicy(params["image-pull-policy"]) if err = updatePodContainers(params, args, envs, imagePullPolicy, &pod.Spec); err != nil { return nil, err diff --git a/vendor/github.com/hyperhq/client-go/tools/clientcmd/api/hyper/user.go b/vendor/github.com/hyperhq/client-go/tools/clientcmd/api/hyper/user.go new file mode 100644 index 0000000..7621002 --- /dev/null +++ b/vendor/github.com/hyperhq/client-go/tools/clientcmd/api/hyper/user.go @@ -0,0 +1,34 @@ +package hyper + +import ( + "fmt" + "log" + "net/http" +) + +type UserCli struct { + hyperCli *HyperConn +} + +func NewUserCli(client *HyperConn) *UserCli { + return &UserCli{ + hyperCli: client, + } +} + +func (u *UserCli) UpdateDefaultZone(tenant, zone string) (int, error) { + var ( + result string + httpStatus int + err error + ) + method := "POST" + endpoint := fmt.Sprintf("/api/v1/users/%v/defaultzone?zone=%v", tenant, zone) + result, httpStatus, err = u.hyperCli.SockRequest(method, endpoint, nil, "") + if err != nil { + log.Fatalf("send request error: %v", err) + } else if httpStatus != http.StatusOK { + log.Fatalf("response error: %v - %v", httpStatus, result) + } + return httpStatus, nil +} diff --git a/vendor/vendor.json b/vendor/vendor.json index c99a85b..797c85f 100644 --- a/vendor/vendor.json +++ b/vendor/vendor.json @@ -467,194 +467,194 @@ { "checksumSHA1": "yP0jHZyO/X7mlED1lLkFST38C3A=", "path": "github.com/hyperhq/client-go/discovery", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "ZBV81XU2aTN29jRyp6zzslCtZfM=", "path": "github.com/hyperhq/client-go/dynamic", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "ssNWqlVTMzZ++SP9NieOXn6meoc=", "path": "github.com/hyperhq/client-go/kubernetes", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "2dQ4AxZJTNX3cdi3HECHU7LRC5w=", "path": "github.com/hyperhq/client-go/kubernetes/scheme", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "n3p0Pyp5+z3ChfZj2AXz/yHNvDA=", "path": "github.com/hyperhq/client-go/kubernetes/typed/admissionregistration/v1alpha1", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "CcNxYIiI0xz1ZWyNMAcwB1KnRBA=", "path": "github.com/hyperhq/client-go/kubernetes/typed/admissionregistration/v1beta1", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "Es8PlPZZuvWAKxkjAJKagSyYQvI=", "path": "github.com/hyperhq/client-go/kubernetes/typed/apps/v1", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "oR1Jat6xDxavRtxWZ91oPLdzBWQ=", "path": "github.com/hyperhq/client-go/kubernetes/typed/apps/v1beta1", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "u8zSxe4VGiU2FPP6tuPykS/josA=", "path": "github.com/hyperhq/client-go/kubernetes/typed/apps/v1beta2", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "8IoFS9Fr1MbY4ByKhTQ31vtEXe0=", "path": "github.com/hyperhq/client-go/kubernetes/typed/authentication/v1", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "O79SQHOnA2ayM/lnKgK6z+OA/rE=", "path": "github.com/hyperhq/client-go/kubernetes/typed/authentication/v1beta1", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "vpJ55r+3vSmIQNThCvBbY8cOGC8=", "path": "github.com/hyperhq/client-go/kubernetes/typed/authorization/v1", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "8if0wRwRVAlBUYriuvvfrc5yZHU=", "path": "github.com/hyperhq/client-go/kubernetes/typed/authorization/v1beta1", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "DwOJrg13MGxtEE+U3ox8jyqQsqg=", "path": "github.com/hyperhq/client-go/kubernetes/typed/autoscaling/v1", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "PWpQdSxjPQAr/WBhE092k4F1r9A=", "path": "github.com/hyperhq/client-go/kubernetes/typed/autoscaling/v2beta1", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "oYxtHRdhZ4Rj4ia/vVzL82eRSRE=", "path": "github.com/hyperhq/client-go/kubernetes/typed/batch/v1", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "IbbF4JRmiDVclMcEiGpftpIi9cE=", "path": "github.com/hyperhq/client-go/kubernetes/typed/batch/v1beta1", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "OVKH4HGnFz/dMnNZZbBT6PmKJQ0=", "path": "github.com/hyperhq/client-go/kubernetes/typed/batch/v2alpha1", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "MqOeozGPnXm8rftsbwMh8yEZL7c=", "path": "github.com/hyperhq/client-go/kubernetes/typed/certificates/v1beta1", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "RptqGh/oArXNT5VHsFWzPOHCgro=", "path": "github.com/hyperhq/client-go/kubernetes/typed/core/v1", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "BD0fLGa1K9AhF8yf3GpNw72NCf4=", "path": "github.com/hyperhq/client-go/kubernetes/typed/events/v1beta1", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "Va6E8TKD6LLEDdJuE4KZudO3IuI=", "path": "github.com/hyperhq/client-go/kubernetes/typed/extensions/v1beta1", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "QpyvabInERSUi97a5U5LzWbt7LI=", "path": "github.com/hyperhq/client-go/kubernetes/typed/networking/v1", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "WqMe9e1qt7y5YH22kS0OuYOHo5U=", "path": "github.com/hyperhq/client-go/kubernetes/typed/policy/v1beta1", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "LnmkXCrjxaHmHV1PgcmlTj046/4=", "path": "github.com/hyperhq/client-go/kubernetes/typed/rbac/v1", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "EYTn3LJ/7Os2BjNEbCwTlHeWq3Y=", "path": "github.com/hyperhq/client-go/kubernetes/typed/rbac/v1alpha1", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "YbFmVDw/aHwOBgICDbpWMvFCIUc=", "path": "github.com/hyperhq/client-go/kubernetes/typed/rbac/v1beta1", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "QCAzt5MnT778Flcx9ZEM2ihsJKs=", "path": "github.com/hyperhq/client-go/kubernetes/typed/scheduling/v1alpha1", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "qpqRr/j2ty0WckUcMCDDWCBJRRc=", "path": "github.com/hyperhq/client-go/kubernetes/typed/settings/v1alpha1", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "YqKplTBCgZHIliHn2PXNH+wW9o8=", "path": "github.com/hyperhq/client-go/kubernetes/typed/storage/v1", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "5994mEEwXzpoFA7EnY83cDv/m88=", "path": "github.com/hyperhq/client-go/kubernetes/typed/storage/v1alpha1", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "NmYZQw5jDpV2c8phg15xG+ANA7Y=", "path": "github.com/hyperhq/client-go/kubernetes/typed/storage/v1beta1", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "GRAF/c5dg/sh94YrlsoZZk9Ep9M=", @@ -673,62 +673,62 @@ { "checksumSHA1": "hvDwMW2YuEiInEGkFMM71IEx0fw=", "path": "github.com/hyperhq/client-go/pkg/version", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "OSlzaPkkg2WXLtPlhE4Ootw0XfU=", "path": "github.com/hyperhq/client-go/plugin/pkg/client/auth", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "om/n03wfHuPZICg/Ixo4EjPVXm8=", "path": "github.com/hyperhq/client-go/plugin/pkg/client/auth/gcp", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "uAEkjvRMWVI784V+i/i7V3lCcVQ=", "path": "github.com/hyperhq/client-go/plugin/pkg/client/auth/oidc", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "xTLRJJ0B6+nXQl8Nsj4xwjwZICM=", "path": "github.com/hyperhq/client-go/plugin/pkg/client/auth/openstack", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "WZ6ti8GKD1NTFFCkDTzKQr0DhKA=", "path": "github.com/hyperhq/client-go/rest", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "dKX5vhhbLWkZlQQp1zi6nINh6rw=", "path": "github.com/hyperhq/client-go/rest/fake", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "oPUJOqO9KyC1m1l4ogwuVzbTzrc=", "path": "github.com/hyperhq/client-go/rest/watch", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "LqcWId46C80QcWMH94SAjWuCO30=", "path": "github.com/hyperhq/client-go/third_party/forked/golang/template", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "q/br9aHs4n3GSdQJ6wVipJE94Ko=", "path": "github.com/hyperhq/client-go/tools/auth", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "S3xUmbDJSmxHZuGd5xJWGpzyq54=", @@ -740,32 +740,32 @@ { "checksumSHA1": "lbHE3x3t4tsPt4cu18dgPcKJuMM=", "path": "github.com/hyperhq/client-go/tools/clientcmd", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "miWOnnToU9nxVRYl58HVHJ4QU6k=", "path": "github.com/hyperhq/client-go/tools/clientcmd/api", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "qj3ryKvXQ4Nai5Hbee+BUH8JqxI=", "path": "github.com/hyperhq/client-go/tools/clientcmd/api/latest", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "cn6aOEZZjPp7BdyelkMaFRR4r28=", "path": "github.com/hyperhq/client-go/tools/clientcmd/api/v1", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "JHx0cbIjhToYvGXLLuXY4Q5nFR0=", "path": "github.com/hyperhq/client-go/tools/metrics", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "LZDImYgUUJkNSZhUdtoRiZqqrgg=", @@ -784,26 +784,26 @@ { "checksumSHA1": "bSlFYZHk5G8HEUXkevmYp7+7g+4=", "path": "github.com/hyperhq/client-go/tools/reference", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "OA8cqn65o62I/jwH5oCUglnmRsc=", "path": "github.com/hyperhq/client-go/tools/remotecommand", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "WZEGEtWrzOrMlP1NFlDelOFQF6Y=", "path": "github.com/hyperhq/client-go/transport", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "GYxiCCpwLXcKio2g89DF+9sVgsQ=", "path": "github.com/hyperhq/client-go/transport/spdy", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "n3ncetJCnZOTqlRfQBgIWR1uZ2w=", @@ -815,38 +815,38 @@ { "checksumSHA1": "yMDiS3/0AmM9ehTKNOnQxjSZa/I=", "path": "github.com/hyperhq/client-go/util/cert", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "O6VO2gDox9WrJbT//4o5jOEB1Gc=", "path": "github.com/hyperhq/client-go/util/exec", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "/SfDz1N+z1fgRgkxOv4pjjulUYU=", "path": "github.com/hyperhq/client-go/util/flowcontrol", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "AITZUftnnuEmnd1pw0yxLPywtA0=", "path": "github.com/hyperhq/client-go/util/homedir", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "WxHq2vHHWWO4kJM1wDs8r1ISZ48=", "path": "github.com/hyperhq/client-go/util/integer", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "0b9VYxxYA3eFVV3/rksoRjJEHu4=", "path": "github.com/hyperhq/client-go/util/jsonpath", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "2m5Xa5ov5RaRYPGOsOozggz2U1E=", @@ -858,8 +858,8 @@ { "checksumSHA1": "DSlSbcFPITI/KHJPB7JjZfjLy2A=", "path": "github.com/hyperhq/client-go/util/testing", - "revision": "94d6685ee4c340e9cae5dcbb1f7e11a87ccd6bfc", - "revisionTime": "2018-05-11T00:49:32Z" + "revision": "c4bda09ae202441e9bb8c0259fbd277f34a42d03", + "revisionTime": "2018-7-21T01:41:32Z" }, { "checksumSHA1": "0H5FZWSmdCP+Uen3gKVbKAS5EPw=",