|
| 1 | +package paddlecloud |
| 2 | + |
| 3 | +import ( |
| 4 | +"context" |
| 5 | +"encoding/json" |
| 6 | +"errors" |
| 7 | +"flag" |
| 8 | +"fmt" |
| 9 | +"os" |
| 10 | +"strings" |
| 11 | + |
| 12 | +"github.com/PaddlePaddle/cloud/go/utils" |
| 13 | +"github.com/golang/glog" |
| 14 | +"github.com/google/subcommands" |
| 15 | +) |
| 16 | + |
| 17 | +const ( |
| 18 | +// RegistryCmdName is subcommand name |
| 19 | +RegistryCmdName = "registry" |
| 20 | +// RegistryPrefix is the prefix for Kubernetes secret name |
| 21 | +RegistryPrefix = "pcloud-registry" |
| 22 | +) |
| 23 | + |
| 24 | +// RegistryCmd is Docker registry secret information |
| 25 | +type RegistryCmd struct { |
| 26 | +SecretName string `json:"name"` |
| 27 | +Username string `json:"username"` |
| 28 | +Password string `json:"password"` |
| 29 | +Server string `json:"server"` |
| 30 | +} |
| 31 | + |
| 32 | +// Name is the subcommand name |
| 33 | +func (r *RegistryCmd) Name() string { return RegistryCmdName } |
| 34 | + |
| 35 | +// Synopsis is the subcommand's synopsis |
| 36 | +func (r *RegistryCmd) Synopsis() string { return "Add registry secret on paddlecloud." } |
| 37 | + |
| 38 | +// Usage is the subcommand's usage |
| 39 | +func (r *RegistryCmd) Usage() string { |
| 40 | +return `registry <options> [add|del]: |
| 41 | +` |
| 42 | +} |
| 43 | + |
| 44 | +// SetFlags registers subcommands flags. |
| 45 | +func (r *RegistryCmd) SetFlags(f *flag.FlagSet) { |
| 46 | +f.StringVar(&r.SecretName, "name", "", "registry secret name") |
| 47 | +f.StringVar(&r.Username, "username", "", "your Docker registry username") |
| 48 | +f.StringVar(&r.Password, "password", "", "your Docker registry password") |
| 49 | +f.StringVar(&r.Server, "server", "", "your Docker registry Server") |
| 50 | +} |
| 51 | +func (r *RegistryCmd) addRegistrySecret() error { |
| 52 | +jsonString, err := json.Marshal(r) |
| 53 | +if err != nil { |
| 54 | +return err |
| 55 | +} |
| 56 | +glog.V(10).Infof("Add registry secret: %s to %s\n", jsonString, utils.Config.ActiveConfig.Endpoint+"/api/v1/registry/") |
| 57 | +respBody, err := utils.PostCall(utils.Config.ActiveConfig.Endpoint+"/api/v1/registry/", jsonString) |
| 58 | +if err != nil { |
| 59 | +return err |
| 60 | +} |
| 61 | +var respObj interface{} |
| 62 | +if err = json.Unmarshal(respBody, &respObj); err != nil { |
| 63 | +return err |
| 64 | +} |
| 65 | +// FIXME: Return an error if error message is not empty. Use response code instead |
| 66 | +errMsg := respObj.(map[string]interface{})["msg"].(string) |
| 67 | +if len(errMsg) > 0 { |
| 68 | +return errors.New(errMsg) |
| 69 | +} |
| 70 | +return nil |
| 71 | +} |
| 72 | + |
| 73 | +// Delete the specify registry |
| 74 | +func (r *RegistryCmd) Delete() error { |
| 75 | +jsonString, err := json.Marshal(r) |
| 76 | +if err != nil { |
| 77 | +return err |
| 78 | +} |
| 79 | +glog.V(10).Infof("Delete registry secret: %s to %s\n", jsonString, utils.Config.ActiveConfig.Endpoint+"/api/v1/registry/") |
| 80 | +respBody, err := utils.DeleteCall(utils.Config.ActiveConfig.Endpoint+"/api/v1/registry/", jsonString) |
| 81 | +if err != nil { |
| 82 | +return err |
| 83 | +} |
| 84 | + |
| 85 | +var respObj interface{} |
| 86 | +if err = json.Unmarshal(respBody, &respObj); err != nil { |
| 87 | +return err |
| 88 | +} |
| 89 | +// FIXME: Return an error if error message is not empty. Use response code instead |
| 90 | +errMsg := respObj.(map[string]interface{})["msg"].(string) |
| 91 | +if len(errMsg) > 0 { |
| 92 | +return errors.New(errMsg) |
| 93 | +} |
| 94 | +return nil |
| 95 | +} |
| 96 | +func (r *RegistryCmd) Execute(_ context.Context, f *flag.FlagSet, _ ...interface{}) subcommands.ExitStatus { |
| 97 | +if r.SecretName == "" || r.Username == "" || r.Password == "" || r.Server == "" { |
| 98 | +f.Usage() |
| 99 | +return subcommands.ExitFailure |
| 100 | +} |
| 101 | +r.SecretName = strings.Join([]string{RegistryPrefix, r.SecretName}, "-") |
| 102 | +err := r.addRegistrySecret() |
| 103 | +if err != nil { |
| 104 | +fmt.Fprintf(os.Stderr, "add registry secret failed: %s\n", err) |
| 105 | +return subcommands.ExitFailure |
| 106 | +} |
| 107 | +return subcommands.ExitSuccess |
| 108 | +} |
| 109 | + |
| 110 | +// KubeRegistryName add a prefix for the name |
| 111 | +func KubeRegistryName(name string) string { |
| 112 | +return RegistryPrefix + "-" + name |
| 113 | +} |
| 114 | + |
| 115 | +// RegistryName is registry secret name for PaddleCloud |
| 116 | +func RegistryName(name string) string { |
| 117 | +if strings.HasPrefix(name, RegistryPrefix) { |
| 118 | +return name[len(RegistryPrefix)+1 : len(name)] |
| 119 | +} |
| 120 | +return "" |
| 121 | +} |
0 commit comments