diff --git a/Makefile b/Makefile index ff2de47382..3b651241ae 100644 --- a/Makefile +++ b/Makefile @@ -105,6 +105,7 @@ codegen: kops-gobindata test: go test k8s.io/kops/pkg/... -args -v=1 -logtostderr + go test k8s.io/kops/nodeup/pkg/... -args -v=1 -logtostderr go test k8s.io/kops/upup/pkg/... -args -v=1 -logtostderr go test k8s.io/kops/nodeup/pkg/... -args -v=1 -logtostderr go test k8s.io/kops/protokube/... -args -v=1 -logtostderr diff --git a/nodeup/pkg/model/docker.go b/nodeup/pkg/model/docker.go index c6dc1596b4..81de66330a 100644 --- a/nodeup/pkg/model/docker.go +++ b/nodeup/pkg/model/docker.go @@ -22,9 +22,11 @@ import ( "github.com/golang/glog" "k8s.io/kops/nodeup/pkg/distros" "k8s.io/kops/nodeup/pkg/model/resources" + "k8s.io/kops/pkg/flagbuilder" "k8s.io/kops/pkg/systemd" "k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi/nodeup/nodetasks" + "strings" ) // DockerBuilder install docker (just the packages at the moment) @@ -289,6 +291,10 @@ func (b *DockerBuilder) Build(c *fi.ModelBuilderContext) error { c.AddTask(b.buildSystemdService(dockerSemver)) + if err := b.buildSysconfig(c); err != nil { + return err + } + return nil } @@ -388,3 +394,25 @@ func (b *DockerBuilder) buildSystemdService(dockerVersion semver.Version) *nodet return service } + +func (b *DockerBuilder) buildSysconfig(c *fi.ModelBuilderContext) error { + flagsString, err := flagbuilder.BuildFlags(b.Cluster.Spec.Docker) + if err != nil { + return fmt.Errorf("error building docker flags: %v", err) + } + + lines := []string{ + "DOCKER_OPTS=" + flagsString, + "DOCKER_NOFILE=1000000", + } + contents := strings.Join(lines, "\n") + + t := &nodetasks.File{ + Path: "/etc/sysconfig/docker", + Contents: fi.NewStringResource(contents), + Type: nodetasks.FileType_File, + } + c.AddTask(t) + + return nil +} diff --git a/nodeup/pkg/model/docker_test.go b/nodeup/pkg/model/docker_test.go index 6a9df24de4..a63a0606bf 100644 --- a/nodeup/pkg/model/docker_test.go +++ b/nodeup/pkg/model/docker_test.go @@ -29,13 +29,64 @@ import ( // Register our APIs _ "k8s.io/kops/pkg/apis/kops/install" + "k8s.io/kops/pkg/flagbuilder" ) -func TestDockerBuilder(t *testing.T) { +func TestDockerBuilder_Simple(t *testing.T) { runDockerBuilderTest(t, "simple") +} + +func TestDockerBuilder_1_12_1(t *testing.T) { runDockerBuilderTest(t, "docker_1.12.1") } +func TestDockerBuilder_LogFlags(t *testing.T) { + runDockerBuilderTest(t, "logflags") +} + +func TestDockerBuilder_BuildFlags(t *testing.T) { + grid := []struct { + config kops.DockerConfig + expected string + }{ + { + kops.DockerConfig{}, + "", + }, + { + kops.DockerConfig{ + LogDriver: "json-file", + }, + "--log-driver=json-file", + }, + { + kops.DockerConfig{ + LogDriver: "json-file", + LogOpt: []string{"max-size=10m"}, + }, + "--log-driver=json-file --log-opt=max-size=10m", + }, + { + kops.DockerConfig{ + LogDriver: "json-file", + LogOpt: []string{"max-size=10m", "max-file=5"}, + }, + "--log-driver=json-file --log-opt=max-file=5 --log-opt=max-size=10m", + }, + } + + for _, g := range grid { + actual, err := flagbuilder.BuildFlags(&g.config) + if err != nil { + t.Errorf("error building flags for %v: %v", g.config, err) + continue + } + if actual != g.expected { + t.Errorf("flags did not match. actual=%q expected=%q", actual, g.expected) + } + } +} + func runDockerBuilderTest(t *testing.T, key string) { basedir := path.Join("tests/dockerbuilder/", key) @@ -85,13 +136,16 @@ func runDockerBuilderTest(t *testing.T, key string) { actualTasksYaml := strings.Join(yamls, "\n---\n") tasksYamlPath := path.Join(basedir, "tasks.yaml") - expectedTasksYaml, err := ioutil.ReadFile(tasksYamlPath) + expectedTasksYamlBytes, err := ioutil.ReadFile(tasksYamlPath) if err != nil { t.Fatalf("error reading file %q: %v", tasksYamlPath, err) } - if strings.TrimSpace(string(expectedTasksYaml)) != strings.TrimSpace(actualTasksYaml) { - diffString := diff.FormatDiff(string(expectedTasksYaml), actualTasksYaml) + actualTasksYaml = strings.TrimSpace(actualTasksYaml) + expectedTasksYaml := strings.TrimSpace(string(expectedTasksYamlBytes)) + + if expectedTasksYaml != actualTasksYaml { + diffString := diff.FormatDiff(expectedTasksYaml, actualTasksYaml) t.Logf("diff:\n%s\n", diffString) t.Fatalf("tasks differed from expected for test %q", key) diff --git a/nodeup/pkg/model/tests/dockerbuilder/docker_1.12.1/tasks.yaml b/nodeup/pkg/model/tests/dockerbuilder/docker_1.12.1/tasks.yaml index a5ae121ed4..7d160b2f47 100644 --- a/nodeup/pkg/model/tests/dockerbuilder/docker_1.12.1/tasks.yaml +++ b/nodeup/pkg/model/tests/dockerbuilder/docker_1.12.1/tasks.yaml @@ -1,4 +1,213 @@ -contents: {} +contents: |- + DOCKER_OPTS= + DOCKER_NOFILE=1000000 +path: /etc/sysconfig/docker +type: file +--- +contents: |2 + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. path: /usr/share/doc/docker/apache.txt type: file --- diff --git a/nodeup/pkg/model/tests/dockerbuilder/logflags/cluster.yaml b/nodeup/pkg/model/tests/dockerbuilder/logflags/cluster.yaml new file mode 100644 index 0000000000..d19145cf38 --- /dev/null +++ b/nodeup/pkg/model/tests/dockerbuilder/logflags/cluster.yaml @@ -0,0 +1,37 @@ +apiVersion: kops/v1alpha2 +kind: Cluster +metadata: + creationTimestamp: "2016-12-10T22:42:27Z" + name: logflags.example.com +spec: + kubernetesApiAccess: + - 0.0.0.0/0 + channel: stable + cloudProvider: aws + configBase: memfs://logflags.example.com/minimal.example.com + etcdClusters: + - etcdMembers: + - instanceGroup: master-us-test-1a + name: master-us-test-1a + name: main + - etcdMembers: + - instanceGroup: master-us-test-1a + name: master-us-test-1a + name: events + kubernetesVersion: v1.6.0 + masterInternalName: api.internal.logflags.example.com + masterPublicName: api.logflags.example.com + networkCIDR: 172.20.0.0/16 + networking: + kubenet: {} + nonMasqueradeCIDR: 100.64.0.0/10 + sshAccess: + - 0.0.0.0/0 + topology: + masters: public + nodes: public + subnets: + - cidr: 172.20.32.0/19 + name: us-test-1a + type: Public + zone: us-test-1a diff --git a/nodeup/pkg/model/tests/dockerbuilder/logflags/tasks.yaml b/nodeup/pkg/model/tests/dockerbuilder/logflags/tasks.yaml new file mode 100644 index 0000000000..cbe8d78108 --- /dev/null +++ b/nodeup/pkg/model/tests/dockerbuilder/logflags/tasks.yaml @@ -0,0 +1,257 @@ +contents: |- + DOCKER_OPTS= + DOCKER_NOFILE=1000000 +path: /etc/sysconfig/docker +type: file +--- +contents: |2 + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. +path: /usr/share/doc/docker/apache.txt +type: file +--- +Name: bridge-utils +--- +Name: docker-engine +hash: b758fc88346a1e5eebf7408b0d0c99f4f134166c +preventStart: true +source: http://apt.dockerproject.org/repo/pool/main/d/docker-engine/docker-engine_1.12.3-0~xenial_amd64.deb +version: 1.12.3-0~xenial +--- +Name: libapparmor1 +--- +Name: libltdl7 +--- +Name: perl +--- +Name: docker.service +definition: | + [Unit] + Description=Docker Application Container Engine + Documentation=https://docs.docker.com + After=network.target docker.socket + Requires=docker.socket + + [Service] + Type=notify + EnvironmentFile=/etc/sysconfig/docker + ExecStart=/usr/bin/dockerd -H fd:// "$DOCKER_OPTS" + ExecReload=/bin/kill -s HUP $MAINPID + KillMode=process + TimeoutStartSec=0 + LimitNOFILE=1048576 + LimitNPROC=1048576 + LimitCORE=infinity + Restart=always + RestartSec=2s + StartLimitInterval=0 + Delegate=yes + ExecStartPre=/opt/kubernetes/helpers/docker-prestart + + [Install] + WantedBy=multi-user.target +enabled: true +manageState: true +running: true +smartRestart: true diff --git a/nodeup/pkg/model/tests/dockerbuilder/simple/tasks.yaml b/nodeup/pkg/model/tests/dockerbuilder/simple/tasks.yaml index c5471a0cd1..cbe8d78108 100644 --- a/nodeup/pkg/model/tests/dockerbuilder/simple/tasks.yaml +++ b/nodeup/pkg/model/tests/dockerbuilder/simple/tasks.yaml @@ -1,4 +1,213 @@ -contents: {} +contents: |- + DOCKER_OPTS= + DOCKER_NOFILE=1000000 +path: /etc/sysconfig/docker +type: file +--- +contents: |2 + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. path: /usr/share/doc/docker/apache.txt type: file --- diff --git a/pkg/apis/kops/dockerconfig.go b/pkg/apis/kops/dockerconfig.go index d0242a6fa2..c66bd4413d 100644 --- a/pkg/apis/kops/dockerconfig.go +++ b/pkg/apis/kops/dockerconfig.go @@ -23,7 +23,7 @@ type DockerConfig struct { IPMasq *bool `json:"ipMasq,omitempty" flag:"ip-masq"` LogDriver string `json:"logDriver,omitempty" flag:"log-driver"` - LogOpt []string `json:"logOpt,omitempty" flag:"log-opt"` + LogOpt []string `json:"logOpt,omitempty" flag:"log-opt,repeat"` // Storage maps to the docker storage flag // But nodeup will also process a comma-separate list, selecting the first supported option diff --git a/pkg/apis/kops/v1alpha1/dockerconfig.go b/pkg/apis/kops/v1alpha1/dockerconfig.go index c8f4f7de60..9ba12c4b66 100644 --- a/pkg/apis/kops/v1alpha1/dockerconfig.go +++ b/pkg/apis/kops/v1alpha1/dockerconfig.go @@ -23,7 +23,7 @@ type DockerConfig struct { IPMasq *bool `json:"ipMasq,omitempty" flag:"ip-masq"` LogDriver *string `json:"logDriver,omitempty" flag:"log-driver"` - LogOpt []string `json:"logOpt,omitempty" flag:"log-opt"` + LogOpt []string `json:"logOpt,omitempty" flag:"log-opt,repeat"` // Storage maps to the docker storage flag // But nodeup will also process a comma-separate list, selecting the first supported option diff --git a/pkg/apis/kops/v1alpha2/dockerconfig.go b/pkg/apis/kops/v1alpha2/dockerconfig.go index e755b44447..918c9761c2 100644 --- a/pkg/apis/kops/v1alpha2/dockerconfig.go +++ b/pkg/apis/kops/v1alpha2/dockerconfig.go @@ -23,7 +23,7 @@ type DockerConfig struct { IPMasq *bool `json:"ipMasq,omitempty" flag:"ip-masq"` LogDriver *string `json:"logDriver,omitempty" flag:"log-driver"` - LogOpt []string `json:"logOpt,omitempty" flag:"log-opt"` + LogOpt []string `json:"logOpt,omitempty" flag:"log-opt,repeat"` // Storage maps to the docker storage flag // But nodeup will also process a comma-separate list, selecting the first supported option diff --git a/pkg/flagbuilder/build_flags.go b/pkg/flagbuilder/build_flags.go index 6ecbbe3edd..a8230f34fe 100644 --- a/pkg/flagbuilder/build_flags.go +++ b/pkg/flagbuilder/build_flags.go @@ -46,7 +46,24 @@ func BuildFlags(options interface{}) (string, error) { glog.V(4).Infof("skipping field with %q flag tag: %s", tag, path) return utils.SkipReflection } - flagName := tag + + // If we specify the repeat option, we will repeat the flag rather than joining it with commas + repeatFlag := false + + tokens := strings.Split(tag, ",") + if len(tokens) > 1 { + for i, t := range tokens { + if i == 0 { + continue + } + if t == "repeat" { + repeatFlag = true + } else { + return fmt.Errorf("cannot parse flag spec: %q", tag) + } + } + } + flagName := tokens[0] // If the "unset" value is not empty string, by setting this tag we avoid passing spurious flag values flagEmpty := field.Tag.Get("flag-empty") @@ -89,8 +106,15 @@ func BuildFlags(options interface{}) (string, error) { // We handle a []string like --admission-control=v1,v2 etc if stringSlice, ok := val.Interface().([]string); ok { if len(stringSlice) != 0 { - flag := fmt.Sprintf("--%s=%s", flagName, strings.Join(stringSlice, ",")) - flags = append(flags, flag) + if repeatFlag { + for _, v := range stringSlice { + flag := fmt.Sprintf("--%s=%s", flagName, v) + flags = append(flags, flag) + } + } else { + flag := fmt.Sprintf("--%s=%s", flagName, strings.Join(stringSlice, ",")) + flags = append(flags, flag) + } } return utils.SkipReflection } else { diff --git a/upup/models/nodeup/docker/_systemd/_debian_family/files/etc/sysconfig/docker.template b/upup/models/nodeup/docker/_systemd/_debian_family/files/etc/sysconfig/docker.template deleted file mode 100644 index 662fc7ede5..0000000000 --- a/upup/models/nodeup/docker/_systemd/_debian_family/files/etc/sysconfig/docker.template +++ /dev/null @@ -1,2 +0,0 @@ -DOCKER_OPTS="{{ BuildFlags .Docker }}" -DOCKER_NOFILE=1000000 diff --git a/upup/models/nodeup/docker/_systemd/_rhel_family/files/etc/sysconfig/docker.template b/upup/models/nodeup/docker/_systemd/_rhel_family/files/etc/sysconfig/docker.template deleted file mode 100644 index 662fc7ede5..0000000000 --- a/upup/models/nodeup/docker/_systemd/_rhel_family/files/etc/sysconfig/docker.template +++ /dev/null @@ -1,2 +0,0 @@ -DOCKER_OPTS="{{ BuildFlags .Docker }}" -DOCKER_NOFILE=1000000 diff --git a/upup/pkg/fi/nodeup/nodetasks/service.go b/upup/pkg/fi/nodeup/nodetasks/service.go index 4079bb62f3..5f9421ef76 100644 --- a/upup/pkg/fi/nodeup/nodetasks/service.go +++ b/upup/pkg/fi/nodeup/nodetasks/service.go @@ -48,14 +48,14 @@ const ( type Service struct { Name string - Definition *string `json:"definition,omitEmpty"` - Running *bool `json:"running"` + Definition *string `json:"definition,omitempty"` + Running *bool `json:"running,omitempty"` // Enabled configures the service to start at boot (or not start at boot) - Enabled *bool `json:"enabled,omitEmpty"` + Enabled *bool `json:"enabled,omitempty"` - ManageState *bool `json:"manageState,omitEmpty"` - SmartRestart *bool `json:"smartRestart,omitEmpty"` + ManageState *bool `json:"manageState,omitempty"` + SmartRestart *bool `json:"smartRestart,omitempty"` } var _ fi.HasDependencies = &Service{} diff --git a/upup/pkg/fi/resources.go b/upup/pkg/fi/resources.go index 6e92c55307..716158e79a 100644 --- a/upup/pkg/fi/resources.go +++ b/upup/pkg/fi/resources.go @@ -119,6 +119,10 @@ type StringResource struct { s string } +func (r *StringResource) MarshalJSON() ([]byte, error) { + return json.Marshal(&r.s) +} + var _ Resource = &StringResource{} func NewStringResource(s string) *StringResource {