Merge pull request #44 from sharifelgamal/label-cmd
adding LABEL command
This commit is contained in:
		
						commit
						f38dd2d85b
					
				|  | @ -44,6 +44,8 @@ func GetCommand(cmd instructions.Command, buildcontext string) (DockerCommand, e | |||
| 		return &ExposeCommand{cmd: c}, nil | ||||
| 	case *instructions.EnvCommand: | ||||
| 		return &EnvCommand{cmd: c}, nil | ||||
| 	case *instructions.LabelCommand: | ||||
| 		return &LabelCommand{cmd: c}, nil | ||||
| 	} | ||||
| 	return nil, errors.Errorf("%s is not a supported command", cmd.Name()) | ||||
| } | ||||
|  |  | |||
|  | @ -69,6 +69,6 @@ func (r *ExposeCommand) FilesToSnapshot() []string { | |||
| } | ||||
| 
 | ||||
| func (r *ExposeCommand) CreatedBy() string { | ||||
| 	s := []string{"/bin/sh", "-c"} | ||||
| 	s := []string{r.cmd.Name()} | ||||
| 	return strings.Join(append(s, r.cmd.Ports...), " ") | ||||
| } | ||||
|  |  | |||
|  | @ -0,0 +1,72 @@ | |||
| /* | ||||
| Copyright 2018 Google LLC | ||||
| 
 | ||||
| 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 commands | ||||
| 
 | ||||
| import ( | ||||
| 	"github.com/containers/image/manifest" | ||||
| 	"github.com/docker/docker/builder/dockerfile/instructions" | ||||
| 	"github.com/docker/docker/builder/dockerfile/shell" | ||||
| 	"github.com/sirupsen/logrus" | ||||
| 	"strings" | ||||
| ) | ||||
| 
 | ||||
| type LabelCommand struct { | ||||
| 	cmd *instructions.LabelCommand | ||||
| } | ||||
| 
 | ||||
| func (r *LabelCommand) ExecuteCommand(config *manifest.Schema2Config) error { | ||||
| 	return updateLabels(r.cmd.Labels, config) | ||||
| } | ||||
| 
 | ||||
| func updateLabels(labels []instructions.KeyValuePair, config *manifest.Schema2Config) error { | ||||
| 	existingLabels := config.Labels | ||||
| 
 | ||||
| 	// Let's unescape values before setting the label
 | ||||
| 	shlex := shell.NewLex('\\') | ||||
| 	for index, kvp := range labels { | ||||
| 		unescaped, err := shlex.ProcessWord(kvp.Value, []string{}) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		labels[index] = instructions.KeyValuePair{ | ||||
| 			Key:   kvp.Key, | ||||
| 			Value: unescaped, | ||||
| 		} | ||||
| 	} | ||||
| 	for _, kvp := range labels { | ||||
| 		logrus.Infof("Applying label %s=%s", kvp.Key, kvp.Value) | ||||
| 		existingLabels[kvp.Key] = kvp.Value | ||||
| 	} | ||||
| 
 | ||||
| 	config.Labels = existingLabels | ||||
| 	return nil | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| // No files have changed, this command only touches metadata.
 | ||||
| func (r *LabelCommand) FilesToSnapshot() []string { | ||||
| 	return []string{} | ||||
| } | ||||
| 
 | ||||
| // CreatedBy returns some information about the command for the image config history
 | ||||
| func (r *LabelCommand) CreatedBy() string { | ||||
| 	l := []string{r.cmd.Name()} | ||||
| 	for _, kvp := range r.cmd.Labels { | ||||
| 		l = append(l, kvp.String()) | ||||
| 	} | ||||
| 	return strings.Join(l, " ") | ||||
| } | ||||
|  | @ -0,0 +1,60 @@ | |||
| /* | ||||
| Copyright 2018 Google LLC | ||||
| 
 | ||||
| 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 commands | ||||
| 
 | ||||
| import ( | ||||
| 	"github.com/GoogleCloudPlatform/k8s-container-builder/testutil" | ||||
| 	"github.com/containers/image/manifest" | ||||
| 	"github.com/docker/docker/builder/dockerfile/instructions" | ||||
| 	"testing" | ||||
| ) | ||||
| 
 | ||||
| func TestUpdateLabels(t *testing.T) { | ||||
| 	cfg := &manifest.Schema2Config{ | ||||
| 		Labels: map[string]string{ | ||||
| 			"foo": "bar", | ||||
| 		}, | ||||
| 	} | ||||
| 
 | ||||
| 	labels := []instructions.KeyValuePair{ | ||||
| 		{ | ||||
| 			Key:   "foo", | ||||
| 			Value: "override", | ||||
| 		}, | ||||
| 		{ | ||||
| 			Key:   "bar", | ||||
| 			Value: "baz", | ||||
| 		}, | ||||
| 		{ | ||||
| 			Key:   "multiword", | ||||
| 			Value: "lots\\ of\\ words", | ||||
| 		}, | ||||
| 		{ | ||||
| 			Key:   "backslashes", | ||||
| 			Value: "lots\\\\ of\\\\ words", | ||||
| 		}, | ||||
| 	} | ||||
| 
 | ||||
| 	expectedLabels := map[string]string{ | ||||
| 		"foo":         "override", | ||||
| 		"bar":         "baz", | ||||
| 		"multiword":   "lots of words", | ||||
| 		"backslashes": "lots\\ of\\ words", | ||||
| 	} | ||||
| 	updateLabels(labels, cfg) | ||||
| 	testutil.CheckErrorAndDeepEqual(t, false, nil, expectedLabels, cfg.Labels) | ||||
| } | ||||
		Loading…
	
		Reference in New Issue