From 4627409bff1205be6eb6c976e56f92fa415a1b95 Mon Sep 17 00:00:00 2001 From: Michael Wan Date: Thu, 26 Apr 2018 11:58:46 -0400 Subject: [PATCH] bugfix: update label compatibility with alidocker Signed-off-by: Michael Wan --- apis/swagger.yml | 6 +++--- apis/types/update_config.go | 23 ++++++++++++++++++----- cli/update.go | 11 ++++++----- daemon/mgr/container.go | 18 +++++++++++++++--- 4 files changed, 42 insertions(+), 16 deletions(-) diff --git a/apis/swagger.yml b/apis/swagger.yml index d828eeb1a..c864eb566 100644 --- a/apis/swagger.yml +++ b/apis/swagger.yml @@ -2110,10 +2110,10 @@ definitions: type: "array" items: type: "string" - Labels: + Label: description: "List of labels set to container." - type: "object" - additionalProperties: + type: "array" + items: type: "string" ContainerUpgradeConfig: diff --git a/apis/types/update_config.go b/apis/types/update_config.go index 9194dd190..501f10872 100644 --- a/apis/types/update_config.go +++ b/apis/types/update_config.go @@ -23,7 +23,7 @@ type UpdateConfig struct { Env []string `json:"Env"` // List of labels set to container. - Labels map[string]string `json:"Labels,omitempty"` + Label []string `json:"Label"` // restart policy RestartPolicy *RestartPolicy `json:"RestartPolicy,omitempty"` @@ -41,7 +41,7 @@ func (m *UpdateConfig) UnmarshalJSON(raw []byte) error { var data struct { Env []string `json:"Env,omitempty"` - Labels map[string]string `json:"Labels,omitempty"` + Label []string `json:"Label,omitempty"` RestartPolicy *RestartPolicy `json:"RestartPolicy,omitempty"` } @@ -51,7 +51,7 @@ func (m *UpdateConfig) UnmarshalJSON(raw []byte) error { m.Env = data.Env - m.Labels = data.Labels + m.Label = data.Label m.RestartPolicy = data.RestartPolicy @@ -71,14 +71,14 @@ func (m UpdateConfig) MarshalJSON() ([]byte, error) { var data struct { Env []string `json:"Env,omitempty"` - Labels map[string]string `json:"Labels,omitempty"` + Label []string `json:"Label,omitempty"` RestartPolicy *RestartPolicy `json:"RestartPolicy,omitempty"` } data.Env = m.Env - data.Labels = m.Labels + data.Label = m.Label data.RestartPolicy = m.RestartPolicy @@ -103,6 +103,10 @@ func (m *UpdateConfig) Validate(formats strfmt.Registry) error { res = append(res, err) } + if err := m.validateLabel(formats); err != nil { + res = append(res, err) + } + if err := m.validateRestartPolicy(formats); err != nil { res = append(res, err) } @@ -122,6 +126,15 @@ func (m *UpdateConfig) validateEnv(formats strfmt.Registry) error { return nil } +func (m *UpdateConfig) validateLabel(formats strfmt.Registry) error { + + if swag.IsZero(m.Label) { // not required + return nil + } + + return nil +} + func (m *UpdateConfig) validateRestartPolicy(formats strfmt.Registry) error { if swag.IsZero(m.RestartPolicy) { // not required diff --git a/cli/update.go b/cli/update.go index 8d37bba97..410077fd9 100644 --- a/cli/update.go +++ b/cli/update.go @@ -58,10 +58,11 @@ func (uc *UpdateCommand) updateRun(args []string) error { container := args[0] ctx := context.Background() - labels, err := opts.ParseLabels(uc.labels) - if err != nil { - return err - } + // UpdateConfig.Label's type change to []string + // labels, err := opts.ParseLabels(uc.labels) + // if err != nil { + // return err + // } if err := opts.ValidateMemorySwappiness(uc.memorySwappiness); err != nil { return err @@ -95,7 +96,7 @@ func (uc *UpdateCommand) updateRun(args []string) error { updateConfig := &types.UpdateConfig{ Env: uc.env, - Labels: labels, + Label: uc.labels, RestartPolicy: restartPolicy, Resources: resource, } diff --git a/daemon/mgr/container.go b/daemon/mgr/container.go index 82a97fd3f..ffcba21a4 100644 --- a/daemon/mgr/container.go +++ b/daemon/mgr/container.go @@ -881,13 +881,25 @@ func (mgr *ContainerManager) Update(ctx context.Context, name string, config *ty return fmt.Errorf("failed to update container %s: can not update kernel memory to a running container, please stop it first", c.ID()) } - if len(config.Labels) != 0 { + // compatibility with alidocker, UpdateConfig.Label is []string + // but ContainerConfig.Labels is map[string]string + if len(config.Label) != 0 { if c.meta.Config.Labels == nil { c.meta.Config.Labels = map[string]string{} } - for k, v := range config.Labels { - c.meta.Config.Labels[k] = v + // support remove some labels + newLabels, err := opts.ParseLabels(config.Label) + if err != nil { + return fmt.Errorf("failed to parse labels: %v", err) + } + + for k, v := range newLabels { + if v == "" { + delete(c.meta.Config.Labels, k) + } else { + c.meta.Config.Labels[k] = v + } } }