mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-04 04:08:16 +00:00 
			
		
		
		
	deps: update containernetworking/cni to v0.5.2
This commit is contained in:
		
							
								
								
									
										27
									
								
								Godeps/Godeps.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										27
									
								
								Godeps/Godeps.json
									
									
									
										generated
									
									
									
								
							@@ -416,18 +416,33 @@
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"ImportPath": "github.com/containernetworking/cni/libcni",
 | 
			
		||||
			"Comment": "v0.3.0-61-g9d5e6e6",
 | 
			
		||||
			"Rev": "9d5e6e60e79491207834ae8439e80c943db65a69"
 | 
			
		||||
			"Comment": "v0.5.2",
 | 
			
		||||
			"Rev": "137b4975ecab6e1f0c24c1e3c228a50a3cfba75e"
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"ImportPath": "github.com/containernetworking/cni/pkg/invoke",
 | 
			
		||||
			"Comment": "v0.3.0-61-g9d5e6e6",
 | 
			
		||||
			"Rev": "9d5e6e60e79491207834ae8439e80c943db65a69"
 | 
			
		||||
			"Comment": "v0.5.2",
 | 
			
		||||
			"Rev": "137b4975ecab6e1f0c24c1e3c228a50a3cfba75e"
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"ImportPath": "github.com/containernetworking/cni/pkg/types",
 | 
			
		||||
			"Comment": "v0.3.0-61-g9d5e6e6",
 | 
			
		||||
			"Rev": "9d5e6e60e79491207834ae8439e80c943db65a69"
 | 
			
		||||
			"Comment": "v0.5.2",
 | 
			
		||||
			"Rev": "137b4975ecab6e1f0c24c1e3c228a50a3cfba75e"
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"ImportPath": "github.com/containernetworking/cni/pkg/types/020",
 | 
			
		||||
			"Comment": "v0.5.2",
 | 
			
		||||
			"Rev": "137b4975ecab6e1f0c24c1e3c228a50a3cfba75e"
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"ImportPath": "github.com/containernetworking/cni/pkg/types/current",
 | 
			
		||||
			"Comment": "v0.5.2",
 | 
			
		||||
			"Rev": "137b4975ecab6e1f0c24c1e3c228a50a3cfba75e"
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"ImportPath": "github.com/containernetworking/cni/pkg/version",
 | 
			
		||||
			"Comment": "v0.5.2",
 | 
			
		||||
			"Rev": "137b4975ecab6e1f0c24c1e3c228a50a3cfba75e"
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"ImportPath": "github.com/coreos/etcd/alarm",
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										630
									
								
								Godeps/LICENSES
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										630
									
								
								Godeps/LICENSES
									
									
									
										generated
									
									
									
								
							@@ -12554,6 +12554,636 @@ SOFTWARE.
 | 
			
		||||
================================================================================
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
================================================================================
 | 
			
		||||
= vendor/github.com/containernetworking/cni/pkg/types/020 licensed under: =
 | 
			
		||||
 | 
			
		||||
                                 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.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
= vendor/github.com/containernetworking/cni/LICENSE fa818a259cbed7ce8bc2a22d35a464fc  -
 | 
			
		||||
================================================================================
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
================================================================================
 | 
			
		||||
= vendor/github.com/containernetworking/cni/pkg/types/current licensed under: =
 | 
			
		||||
 | 
			
		||||
                                 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.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
= vendor/github.com/containernetworking/cni/LICENSE fa818a259cbed7ce8bc2a22d35a464fc  -
 | 
			
		||||
================================================================================
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
================================================================================
 | 
			
		||||
= vendor/github.com/containernetworking/cni/pkg/version licensed under: =
 | 
			
		||||
 | 
			
		||||
                                 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.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
= vendor/github.com/containernetworking/cni/LICENSE fa818a259cbed7ce8bc2a22d35a464fc  -
 | 
			
		||||
================================================================================
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
================================================================================
 | 
			
		||||
= vendor/github.com/coreos/etcd/alarm licensed under: =
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										152
									
								
								vendor/github.com/containernetworking/cni/libcni/api.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										152
									
								
								vendor/github.com/containernetworking/cni/libcni/api.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -15,10 +15,12 @@
 | 
			
		||||
package libcni
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"os"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"github.com/containernetworking/cni/pkg/invoke"
 | 
			
		||||
	"github.com/containernetworking/cni/pkg/types"
 | 
			
		||||
	"github.com/containernetworking/cni/pkg/version"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type RuntimeConf struct {
 | 
			
		||||
@@ -26,6 +28,12 @@ type RuntimeConf struct {
 | 
			
		||||
	NetNS       string
 | 
			
		||||
	IfName      string
 | 
			
		||||
	Args        [][2]string
 | 
			
		||||
	// A dictionary of capability-specific data passed by the runtime
 | 
			
		||||
	// to plugins as top-level keys in the 'runtimeConfig' dictionary
 | 
			
		||||
	// of the plugin's stdin data.  libcni will ensure that only keys
 | 
			
		||||
	// in this map which match the capabilities of the plugin are passed
 | 
			
		||||
	// to the plugin
 | 
			
		||||
	CapabilityArgs map[string]interface{}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type NetworkConfig struct {
 | 
			
		||||
@@ -33,8 +41,18 @@ type NetworkConfig struct {
 | 
			
		||||
	Bytes   []byte
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type NetworkConfigList struct {
 | 
			
		||||
	Name       string
 | 
			
		||||
	CNIVersion string
 | 
			
		||||
	Plugins    []*NetworkConfig
 | 
			
		||||
	Bytes      []byte
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type CNI interface {
 | 
			
		||||
	AddNetwork(net *NetworkConfig, rt *RuntimeConf) (*types.Result, error)
 | 
			
		||||
	AddNetworkList(net *NetworkConfigList, rt *RuntimeConf) (types.Result, error)
 | 
			
		||||
	DelNetworkList(net *NetworkConfigList, rt *RuntimeConf) error
 | 
			
		||||
 | 
			
		||||
	AddNetwork(net *NetworkConfig, rt *RuntimeConf) (types.Result, error)
 | 
			
		||||
	DelNetwork(net *NetworkConfig, rt *RuntimeConf) error
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -42,24 +60,152 @@ type CNIConfig struct {
 | 
			
		||||
	Path []string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *CNIConfig) AddNetwork(net *NetworkConfig, rt *RuntimeConf) (*types.Result, error) {
 | 
			
		||||
// CNIConfig implements the CNI interface
 | 
			
		||||
var _ CNI = &CNIConfig{}
 | 
			
		||||
 | 
			
		||||
func buildOneConfig(list *NetworkConfigList, orig *NetworkConfig, prevResult types.Result, rt *RuntimeConf) (*NetworkConfig, error) {
 | 
			
		||||
	var err error
 | 
			
		||||
 | 
			
		||||
	inject := map[string]interface{}{
 | 
			
		||||
		"name":       list.Name,
 | 
			
		||||
		"cniVersion": list.CNIVersion,
 | 
			
		||||
	}
 | 
			
		||||
	// Add previous plugin result
 | 
			
		||||
	if prevResult != nil {
 | 
			
		||||
		inject["prevResult"] = prevResult
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Ensure every config uses the same name and version
 | 
			
		||||
	orig, err = InjectConf(orig, inject)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return injectRuntimeConfig(orig, rt)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// This function takes a libcni RuntimeConf structure and injects values into
 | 
			
		||||
// a "runtimeConfig" dictionary in the CNI network configuration JSON that
 | 
			
		||||
// will be passed to the plugin on stdin.
 | 
			
		||||
//
 | 
			
		||||
// Only "capabilities arguments" passed by the runtime are currently injected.
 | 
			
		||||
// These capabilities arguments are filtered through the plugin's advertised
 | 
			
		||||
// capabilities from its config JSON, and any keys in the CapabilityArgs
 | 
			
		||||
// matching plugin capabilities are added to the "runtimeConfig" dictionary
 | 
			
		||||
// sent to the plugin via JSON on stdin.  For exmaple, if the plugin's
 | 
			
		||||
// capabilities include "portMappings", and the CapabilityArgs map includes a
 | 
			
		||||
// "portMappings" key, that key and its value are added to the "runtimeConfig"
 | 
			
		||||
// dictionary to be passed to the plugin's stdin.
 | 
			
		||||
func injectRuntimeConfig(orig *NetworkConfig, rt *RuntimeConf) (*NetworkConfig, error) {
 | 
			
		||||
	var err error
 | 
			
		||||
 | 
			
		||||
	rc := make(map[string]interface{})
 | 
			
		||||
	for capability, supported := range orig.Network.Capabilities {
 | 
			
		||||
		if !supported {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		if data, ok := rt.CapabilityArgs[capability]; ok {
 | 
			
		||||
			rc[capability] = data
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(rc) > 0 {
 | 
			
		||||
		orig, err = InjectConf(orig, map[string]interface{}{"runtimeConfig": rc})
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return orig, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AddNetworkList executes a sequence of plugins with the ADD command
 | 
			
		||||
func (c *CNIConfig) AddNetworkList(list *NetworkConfigList, rt *RuntimeConf) (types.Result, error) {
 | 
			
		||||
	var prevResult types.Result
 | 
			
		||||
	for _, net := range list.Plugins {
 | 
			
		||||
		pluginPath, err := invoke.FindInPath(net.Network.Type, c.Path)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		newConf, err := buildOneConfig(list, net, prevResult, rt)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		prevResult, err = invoke.ExecPluginWithResult(pluginPath, newConf.Bytes, c.args("ADD", rt))
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return prevResult, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DelNetworkList executes a sequence of plugins with the DEL command
 | 
			
		||||
func (c *CNIConfig) DelNetworkList(list *NetworkConfigList, rt *RuntimeConf) error {
 | 
			
		||||
	for i := len(list.Plugins) - 1; i >= 0; i-- {
 | 
			
		||||
		net := list.Plugins[i]
 | 
			
		||||
 | 
			
		||||
		pluginPath, err := invoke.FindInPath(net.Network.Type, c.Path)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		newConf, err := buildOneConfig(list, net, nil, rt)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if err := invoke.ExecPluginWithoutResult(pluginPath, newConf.Bytes, c.args("DEL", rt)); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AddNetwork executes the plugin with the ADD command
 | 
			
		||||
func (c *CNIConfig) AddNetwork(net *NetworkConfig, rt *RuntimeConf) (types.Result, error) {
 | 
			
		||||
	pluginPath, err := invoke.FindInPath(net.Network.Type, c.Path)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	net, err = injectRuntimeConfig(net, rt)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return invoke.ExecPluginWithResult(pluginPath, net.Bytes, c.args("ADD", rt))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DelNetwork executes the plugin with the DEL command
 | 
			
		||||
func (c *CNIConfig) DelNetwork(net *NetworkConfig, rt *RuntimeConf) error {
 | 
			
		||||
	pluginPath, err := invoke.FindInPath(net.Network.Type, c.Path)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	net, err = injectRuntimeConfig(net, rt)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return invoke.ExecPluginWithoutResult(pluginPath, net.Bytes, c.args("DEL", rt))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetVersionInfo reports which versions of the CNI spec are supported by
 | 
			
		||||
// the given plugin.
 | 
			
		||||
func (c *CNIConfig) GetVersionInfo(pluginType string) (version.PluginInfo, error) {
 | 
			
		||||
	pluginPath, err := invoke.FindInPath(pluginType, c.Path)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return invoke.GetVersionInfo(pluginPath)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// =====
 | 
			
		||||
func (c *CNIConfig) args(action string, rt *RuntimeConf) *invoke.Args {
 | 
			
		||||
	return &invoke.Args{
 | 
			
		||||
@@ -68,6 +214,6 @@ func (c *CNIConfig) args(action string, rt *RuntimeConf) *invoke.Args {
 | 
			
		||||
		NetNS:       rt.NetNS,
 | 
			
		||||
		PluginArgs:  rt.Args,
 | 
			
		||||
		IfName:      rt.IfName,
 | 
			
		||||
		Path:        strings.Join(c.Path, ":"),
 | 
			
		||||
		Path:        strings.Join(c.Path, string(os.PathListSeparator)),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										166
									
								
								vendor/github.com/containernetworking/cni/libcni/conf.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										166
									
								
								vendor/github.com/containernetworking/cni/libcni/conf.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -23,6 +23,23 @@ import (
 | 
			
		||||
	"sort"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type NotFoundError struct {
 | 
			
		||||
	Dir  string
 | 
			
		||||
	Name string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e NotFoundError) Error() string {
 | 
			
		||||
	return fmt.Sprintf(`no net configuration with name "%s" in %s`, e.Name, e.Dir)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type NoConfigsFoundError struct {
 | 
			
		||||
	Dir string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e NoConfigsFoundError) Error() string {
 | 
			
		||||
	return fmt.Sprintf(`no net configurations found in %s`, e.Dir)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ConfFromBytes(bytes []byte) (*NetworkConfig, error) {
 | 
			
		||||
	conf := &NetworkConfig{Bytes: bytes}
 | 
			
		||||
	if err := json.Unmarshal(bytes, &conf.Network); err != nil {
 | 
			
		||||
@@ -39,7 +56,73 @@ func ConfFromFile(filename string) (*NetworkConfig, error) {
 | 
			
		||||
	return ConfFromBytes(bytes)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ConfFiles(dir string) ([]string, error) {
 | 
			
		||||
func ConfListFromBytes(bytes []byte) (*NetworkConfigList, error) {
 | 
			
		||||
	rawList := make(map[string]interface{})
 | 
			
		||||
	if err := json.Unmarshal(bytes, &rawList); err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("error parsing configuration list: %s", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	rawName, ok := rawList["name"]
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return nil, fmt.Errorf("error parsing configuration list: no name")
 | 
			
		||||
	}
 | 
			
		||||
	name, ok := rawName.(string)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return nil, fmt.Errorf("error parsing configuration list: invalid name type %T", rawName)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var cniVersion string
 | 
			
		||||
	rawVersion, ok := rawList["cniVersion"]
 | 
			
		||||
	if ok {
 | 
			
		||||
		cniVersion, ok = rawVersion.(string)
 | 
			
		||||
		if !ok {
 | 
			
		||||
			return nil, fmt.Errorf("error parsing configuration list: invalid cniVersion type %T", rawVersion)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	list := &NetworkConfigList{
 | 
			
		||||
		Name:       name,
 | 
			
		||||
		CNIVersion: cniVersion,
 | 
			
		||||
		Bytes:      bytes,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var plugins []interface{}
 | 
			
		||||
	plug, ok := rawList["plugins"]
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return nil, fmt.Errorf("error parsing configuration list: no 'plugins' key")
 | 
			
		||||
	}
 | 
			
		||||
	plugins, ok = plug.([]interface{})
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return nil, fmt.Errorf("error parsing configuration list: invalid 'plugins' type %T", plug)
 | 
			
		||||
	}
 | 
			
		||||
	if len(plugins) == 0 {
 | 
			
		||||
		return nil, fmt.Errorf("error parsing configuration list: no plugins in list")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for i, conf := range plugins {
 | 
			
		||||
		newBytes, err := json.Marshal(conf)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, fmt.Errorf("Failed to marshal plugin config %d: %v", i, err)
 | 
			
		||||
		}
 | 
			
		||||
		netConf, err := ConfFromBytes(newBytes)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, fmt.Errorf("Failed to parse plugin config %d: %v", i, err)
 | 
			
		||||
		}
 | 
			
		||||
		list.Plugins = append(list.Plugins, netConf)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return list, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ConfListFromFile(filename string) (*NetworkConfigList, error) {
 | 
			
		||||
	bytes, err := ioutil.ReadFile(filename)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("error reading %s: %s", filename, err)
 | 
			
		||||
	}
 | 
			
		||||
	return ConfListFromBytes(bytes)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ConfFiles(dir string, extensions []string) ([]string, error) {
 | 
			
		||||
	// In part, adapted from rkt/networking/podenv.go#listFiles
 | 
			
		||||
	files, err := ioutil.ReadDir(dir)
 | 
			
		||||
	switch {
 | 
			
		||||
@@ -55,20 +138,23 @@ func ConfFiles(dir string) ([]string, error) {
 | 
			
		||||
		if f.IsDir() {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		if filepath.Ext(f.Name()) == ".conf" {
 | 
			
		||||
		fileExt := filepath.Ext(f.Name())
 | 
			
		||||
		for _, ext := range extensions {
 | 
			
		||||
			if fileExt == ext {
 | 
			
		||||
				confFiles = append(confFiles, filepath.Join(dir, f.Name()))
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return confFiles, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func LoadConf(dir, name string) (*NetworkConfig, error) {
 | 
			
		||||
	files, err := ConfFiles(dir)
 | 
			
		||||
	files, err := ConfFiles(dir, []string{".conf", ".json"})
 | 
			
		||||
	switch {
 | 
			
		||||
	case err != nil:
 | 
			
		||||
		return nil, err
 | 
			
		||||
	case len(files) == 0:
 | 
			
		||||
		return nil, fmt.Errorf("no net configurations found")
 | 
			
		||||
		return nil, NoConfigsFoundError{Dir: dir}
 | 
			
		||||
	}
 | 
			
		||||
	sort.Strings(files)
 | 
			
		||||
 | 
			
		||||
@@ -81,25 +167,59 @@ func LoadConf(dir, name string) (*NetworkConfig, error) {
 | 
			
		||||
			return conf, nil
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil, fmt.Errorf(`no net configuration with name "%s" in %s`, name, dir)
 | 
			
		||||
	return nil, NotFoundError{dir, name}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func InjectConf(original *NetworkConfig, key string, newValue interface{}) (*NetworkConfig, error) {
 | 
			
		||||
func LoadConfList(dir, name string) (*NetworkConfigList, error) {
 | 
			
		||||
	files, err := ConfFiles(dir, []string{".conflist"})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	sort.Strings(files)
 | 
			
		||||
 | 
			
		||||
	for _, confFile := range files {
 | 
			
		||||
		conf, err := ConfListFromFile(confFile)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		if conf.Name == name {
 | 
			
		||||
			return conf, nil
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Try and load a network configuration file (instead of list)
 | 
			
		||||
	// from the same name, then upconvert.
 | 
			
		||||
	singleConf, err := LoadConf(dir, name)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		// A little extra logic so the error makes sense
 | 
			
		||||
		if _, ok := err.(NoConfigsFoundError); len(files) != 0 && ok {
 | 
			
		||||
			// Config lists found but no config files found
 | 
			
		||||
			return nil, NotFoundError{dir, name}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return ConfListFromConf(singleConf)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func InjectConf(original *NetworkConfig, newValues map[string]interface{}) (*NetworkConfig, error) {
 | 
			
		||||
	config := make(map[string]interface{})
 | 
			
		||||
	err := json.Unmarshal(original.Bytes, &config)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("unmarshal existing network bytes: %s", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for key, value := range newValues {
 | 
			
		||||
		if key == "" {
 | 
			
		||||
		return nil, fmt.Errorf("key value can not be empty")
 | 
			
		||||
			return nil, fmt.Errorf("keys cannot be empty")
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	if newValue == nil {
 | 
			
		||||
		return nil, fmt.Errorf("newValue must be specified")
 | 
			
		||||
		if value == nil {
 | 
			
		||||
			return nil, fmt.Errorf("key '%s' value must not be nil", key)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	config[key] = newValue
 | 
			
		||||
		config[key] = value
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	newBytes, err := json.Marshal(config)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
@@ -108,3 +228,29 @@ func InjectConf(original *NetworkConfig, key string, newValue interface{}) (*Net
 | 
			
		||||
 | 
			
		||||
	return ConfFromBytes(newBytes)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ConfListFromConf "upconverts" a network config in to a NetworkConfigList,
 | 
			
		||||
// with the single network as the only entry in the list.
 | 
			
		||||
func ConfListFromConf(original *NetworkConfig) (*NetworkConfigList, error) {
 | 
			
		||||
	// Re-deserialize the config's json, then make a raw map configlist.
 | 
			
		||||
	// This may seem a bit strange, but it's to make the Bytes fields
 | 
			
		||||
	// actually make sense. Otherwise, the generated json is littered with
 | 
			
		||||
	// golang default values.
 | 
			
		||||
 | 
			
		||||
	rawConfig := make(map[string]interface{})
 | 
			
		||||
	if err := json.Unmarshal(original.Bytes, &rawConfig); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	rawConfigList := map[string]interface{}{
 | 
			
		||||
		"name":       original.Network.Name,
 | 
			
		||||
		"cniVersion": original.Network.CNIVersion,
 | 
			
		||||
		"plugins":    []interface{}{rawConfig},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	b, err := json.Marshal(rawConfigList)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return ConfListFromBytes(b)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								vendor/github.com/containernetworking/cni/pkg/invoke/args.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/containernetworking/cni/pkg/invoke/args.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -47,6 +47,9 @@ type Args struct {
 | 
			
		||||
	Path          string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Args implements the CNIArgs interface
 | 
			
		||||
var _ CNIArgs = &Args{}
 | 
			
		||||
 | 
			
		||||
func (args *Args) AsEnv() []string {
 | 
			
		||||
	env := os.Environ()
 | 
			
		||||
	pluginArgsStr := args.PluginArgsStr
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										8
									
								
								vendor/github.com/containernetworking/cni/pkg/invoke/delegate.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								vendor/github.com/containernetworking/cni/pkg/invoke/delegate.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -17,17 +17,17 @@ package invoke
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"os"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
 | 
			
		||||
	"github.com/containernetworking/cni/pkg/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func DelegateAdd(delegatePlugin string, netconf []byte) (*types.Result, error) {
 | 
			
		||||
func DelegateAdd(delegatePlugin string, netconf []byte) (types.Result, error) {
 | 
			
		||||
	if os.Getenv("CNI_COMMAND") != "ADD" {
 | 
			
		||||
		return nil, fmt.Errorf("CNI_COMMAND is not ADD")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	paths := strings.Split(os.Getenv("CNI_PATH"), ":")
 | 
			
		||||
	paths := filepath.SplitList(os.Getenv("CNI_PATH"))
 | 
			
		||||
 | 
			
		||||
	pluginPath, err := FindInPath(delegatePlugin, paths)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
@@ -42,7 +42,7 @@ func DelegateDel(delegatePlugin string, netconf []byte) error {
 | 
			
		||||
		return fmt.Errorf("CNI_COMMAND is not DEL")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	paths := strings.Split(os.Getenv("CNI_PATH"), ":")
 | 
			
		||||
	paths := filepath.SplitList(os.Getenv("CNI_PATH"))
 | 
			
		||||
 | 
			
		||||
	pluginPath, err := FindInPath(delegatePlugin, paths)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										88
									
								
								vendor/github.com/containernetworking/cni/pkg/invoke/exec.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										88
									
								
								vendor/github.com/containernetworking/cni/pkg/invoke/exec.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -15,61 +15,81 @@
 | 
			
		||||
package invoke
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"os"
 | 
			
		||||
	"os/exec"
 | 
			
		||||
 | 
			
		||||
	"github.com/containernetworking/cni/pkg/types"
 | 
			
		||||
	"github.com/containernetworking/cni/pkg/version"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func pluginErr(err error, output []byte) error {
 | 
			
		||||
	if _, ok := err.(*exec.ExitError); ok {
 | 
			
		||||
		emsg := types.Error{}
 | 
			
		||||
		if perr := json.Unmarshal(output, &emsg); perr != nil {
 | 
			
		||||
			return fmt.Errorf("netplugin failed but error parsing its diagnostic message %q: %v", string(output), perr)
 | 
			
		||||
		}
 | 
			
		||||
		details := ""
 | 
			
		||||
		if emsg.Details != "" {
 | 
			
		||||
			details = fmt.Sprintf("; %v", emsg.Details)
 | 
			
		||||
		}
 | 
			
		||||
		return fmt.Errorf("%v%v", emsg.Msg, details)
 | 
			
		||||
func ExecPluginWithResult(pluginPath string, netconf []byte, args CNIArgs) (types.Result, error) {
 | 
			
		||||
	return defaultPluginExec.WithResult(pluginPath, netconf, args)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
	return err
 | 
			
		||||
func ExecPluginWithoutResult(pluginPath string, netconf []byte, args CNIArgs) error {
 | 
			
		||||
	return defaultPluginExec.WithoutResult(pluginPath, netconf, args)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ExecPluginWithResult(pluginPath string, netconf []byte, args CNIArgs) (*types.Result, error) {
 | 
			
		||||
	stdoutBytes, err := execPlugin(pluginPath, netconf, args)
 | 
			
		||||
func GetVersionInfo(pluginPath string) (version.PluginInfo, error) {
 | 
			
		||||
	return defaultPluginExec.GetVersionInfo(pluginPath)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var defaultPluginExec = &PluginExec{
 | 
			
		||||
	RawExec:        &RawExec{Stderr: os.Stderr},
 | 
			
		||||
	VersionDecoder: &version.PluginDecoder{},
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type PluginExec struct {
 | 
			
		||||
	RawExec interface {
 | 
			
		||||
		ExecPlugin(pluginPath string, stdinData []byte, environ []string) ([]byte, error)
 | 
			
		||||
	}
 | 
			
		||||
	VersionDecoder interface {
 | 
			
		||||
		Decode(jsonBytes []byte) (version.PluginInfo, error)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e *PluginExec) WithResult(pluginPath string, netconf []byte, args CNIArgs) (types.Result, error) {
 | 
			
		||||
	stdoutBytes, err := e.RawExec.ExecPlugin(pluginPath, netconf, args.AsEnv())
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	res := &types.Result{}
 | 
			
		||||
	err = json.Unmarshal(stdoutBytes, res)
 | 
			
		||||
	return res, err
 | 
			
		||||
	// Plugin must return result in same version as specified in netconf
 | 
			
		||||
	versionDecoder := &version.ConfigDecoder{}
 | 
			
		||||
	confVersion, err := versionDecoder.Decode(netconf)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
func ExecPluginWithoutResult(pluginPath string, netconf []byte, args CNIArgs) error {
 | 
			
		||||
	_, err := execPlugin(pluginPath, netconf, args)
 | 
			
		||||
	return version.NewResult(confVersion, stdoutBytes)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e *PluginExec) WithoutResult(pluginPath string, netconf []byte, args CNIArgs) error {
 | 
			
		||||
	_, err := e.RawExec.ExecPlugin(pluginPath, netconf, args.AsEnv())
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func execPlugin(pluginPath string, netconf []byte, args CNIArgs) ([]byte, error) {
 | 
			
		||||
	stdout := &bytes.Buffer{}
 | 
			
		||||
// GetVersionInfo returns the version information available about the plugin.
 | 
			
		||||
// For recent-enough plugins, it uses the information returned by the VERSION
 | 
			
		||||
// command.  For older plugins which do not recognize that command, it reports
 | 
			
		||||
// version 0.1.0
 | 
			
		||||
func (e *PluginExec) GetVersionInfo(pluginPath string) (version.PluginInfo, error) {
 | 
			
		||||
	args := &Args{
 | 
			
		||||
		Command: "VERSION",
 | 
			
		||||
 | 
			
		||||
	c := exec.Cmd{
 | 
			
		||||
		Env:    args.AsEnv(),
 | 
			
		||||
		Path:   pluginPath,
 | 
			
		||||
		Args:   []string{pluginPath},
 | 
			
		||||
		Stdin:  bytes.NewBuffer(netconf),
 | 
			
		||||
		Stdout: stdout,
 | 
			
		||||
		Stderr: os.Stderr,
 | 
			
		||||
		// set fake values required by plugins built against an older version of skel
 | 
			
		||||
		NetNS:  "dummy",
 | 
			
		||||
		IfName: "dummy",
 | 
			
		||||
		Path:   "dummy",
 | 
			
		||||
	}
 | 
			
		||||
	if err := c.Run(); err != nil {
 | 
			
		||||
		return nil, pluginErr(err, stdout.Bytes())
 | 
			
		||||
	stdin := []byte(fmt.Sprintf(`{"cniVersion":%q}`, version.Current()))
 | 
			
		||||
	stdoutBytes, err := e.RawExec.ExecPlugin(pluginPath, stdin, args.AsEnv())
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		if err.Error() == "unknown CNI_COMMAND: VERSION" {
 | 
			
		||||
			return version.PluginSupports("0.1.0"), nil
 | 
			
		||||
		}
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return stdout.Bytes(), nil
 | 
			
		||||
	return e.VersionDecoder.Decode(stdoutBytes)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										20
									
								
								vendor/github.com/containernetworking/cni/pkg/invoke/find.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								vendor/github.com/containernetworking/cni/pkg/invoke/find.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -30,18 +30,14 @@ func FindInPath(plugin string, paths []string) (string, error) {
 | 
			
		||||
		return "", fmt.Errorf("no paths provided")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var fullpath string
 | 
			
		||||
	for _, path := range paths {
 | 
			
		||||
		full := filepath.Join(path, plugin)
 | 
			
		||||
		if fi, err := os.Stat(full); err == nil && fi.Mode().IsRegular() {
 | 
			
		||||
			fullpath = full
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if fullpath == "" {
 | 
			
		||||
		return "", fmt.Errorf("failed to find plugin %q in path %s", plugin, paths)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
		for _, fe := range ExecutableFileExtensions {
 | 
			
		||||
			fullpath := filepath.Join(path, plugin) + fe
 | 
			
		||||
			if fi, err := os.Stat(fullpath); err == nil && fi.Mode().IsRegular() {
 | 
			
		||||
				return fullpath, nil
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return "", fmt.Errorf("failed to find plugin %q in path %s", plugin, paths)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										20
									
								
								vendor/github.com/containernetworking/cni/pkg/invoke/os_unix.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								vendor/github.com/containernetworking/cni/pkg/invoke/os_unix.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
			
		||||
// Copyright 2016 CNI 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.
 | 
			
		||||
 | 
			
		||||
// +build darwin dragonfly freebsd linux netbsd opensbd solaris
 | 
			
		||||
 | 
			
		||||
package invoke
 | 
			
		||||
 | 
			
		||||
// Valid file extensions for plugin executables.
 | 
			
		||||
var ExecutableFileExtensions = []string{""}
 | 
			
		||||
							
								
								
									
										18
									
								
								vendor/github.com/containernetworking/cni/pkg/invoke/os_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								vendor/github.com/containernetworking/cni/pkg/invoke/os_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
			
		||||
// Copyright 2016 CNI 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 invoke
 | 
			
		||||
 | 
			
		||||
// Valid file extensions for plugin executables.
 | 
			
		||||
var ExecutableFileExtensions = []string{".exe", ""}
 | 
			
		||||
							
								
								
									
										63
									
								
								vendor/github.com/containernetworking/cni/pkg/invoke/raw_exec.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								vendor/github.com/containernetworking/cni/pkg/invoke/raw_exec.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,63 @@
 | 
			
		||||
// Copyright 2016 CNI 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 invoke
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"os/exec"
 | 
			
		||||
 | 
			
		||||
	"github.com/containernetworking/cni/pkg/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type RawExec struct {
 | 
			
		||||
	Stderr io.Writer
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e *RawExec) ExecPlugin(pluginPath string, stdinData []byte, environ []string) ([]byte, error) {
 | 
			
		||||
	stdout := &bytes.Buffer{}
 | 
			
		||||
 | 
			
		||||
	c := exec.Cmd{
 | 
			
		||||
		Env:    environ,
 | 
			
		||||
		Path:   pluginPath,
 | 
			
		||||
		Args:   []string{pluginPath},
 | 
			
		||||
		Stdin:  bytes.NewBuffer(stdinData),
 | 
			
		||||
		Stdout: stdout,
 | 
			
		||||
		Stderr: e.Stderr,
 | 
			
		||||
	}
 | 
			
		||||
	if err := c.Run(); err != nil {
 | 
			
		||||
		return nil, pluginErr(err, stdout.Bytes())
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return stdout.Bytes(), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func pluginErr(err error, output []byte) error {
 | 
			
		||||
	if _, ok := err.(*exec.ExitError); ok {
 | 
			
		||||
		emsg := types.Error{}
 | 
			
		||||
		if perr := json.Unmarshal(output, &emsg); perr != nil {
 | 
			
		||||
			return fmt.Errorf("netplugin failed but error parsing its diagnostic message %q: %v", string(output), perr)
 | 
			
		||||
		}
 | 
			
		||||
		details := ""
 | 
			
		||||
		if emsg.Details != "" {
 | 
			
		||||
			details = fmt.Sprintf("; %v", emsg.Details)
 | 
			
		||||
		}
 | 
			
		||||
		return fmt.Errorf("%v%v", emsg.Msg, details)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										133
									
								
								vendor/github.com/containernetworking/cni/pkg/types/020/types.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										133
									
								
								vendor/github.com/containernetworking/cni/pkg/types/020/types.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,133 @@
 | 
			
		||||
// Copyright 2016 CNI 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 types020
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net"
 | 
			
		||||
	"os"
 | 
			
		||||
 | 
			
		||||
	"github.com/containernetworking/cni/pkg/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const implementedSpecVersion string = "0.2.0"
 | 
			
		||||
 | 
			
		||||
var SupportedVersions = []string{"", "0.1.0", implementedSpecVersion}
 | 
			
		||||
 | 
			
		||||
// Compatibility types for CNI version 0.1.0 and 0.2.0
 | 
			
		||||
 | 
			
		||||
func NewResult(data []byte) (types.Result, error) {
 | 
			
		||||
	result := &Result{}
 | 
			
		||||
	if err := json.Unmarshal(data, result); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return result, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetResult(r types.Result) (*Result, error) {
 | 
			
		||||
	// We expect version 0.1.0/0.2.0 results
 | 
			
		||||
	result020, err := r.GetAsVersion(implementedSpecVersion)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	result, ok := result020.(*Result)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return nil, fmt.Errorf("failed to convert result")
 | 
			
		||||
	}
 | 
			
		||||
	return result, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Result is what gets returned from the plugin (via stdout) to the caller
 | 
			
		||||
type Result struct {
 | 
			
		||||
	IP4 *IPConfig `json:"ip4,omitempty"`
 | 
			
		||||
	IP6 *IPConfig `json:"ip6,omitempty"`
 | 
			
		||||
	DNS types.DNS `json:"dns,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *Result) Version() string {
 | 
			
		||||
	return implementedSpecVersion
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *Result) GetAsVersion(version string) (types.Result, error) {
 | 
			
		||||
	for _, supportedVersion := range SupportedVersions {
 | 
			
		||||
		if version == supportedVersion {
 | 
			
		||||
			return r, nil
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil, fmt.Errorf("cannot convert version %q to %s", SupportedVersions, version)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *Result) Print() error {
 | 
			
		||||
	data, err := json.MarshalIndent(r, "", "    ")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	_, err = os.Stdout.Write(data)
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// String returns a formatted string in the form of "[IP4: $1,][ IP6: $2,] DNS: $3" where
 | 
			
		||||
// $1 represents the receiver's IPv4, $2 represents the receiver's IPv6 and $3 the
 | 
			
		||||
// receiver's DNS. If $1 or $2 are nil, they won't be present in the returned string.
 | 
			
		||||
func (r *Result) String() string {
 | 
			
		||||
	var str string
 | 
			
		||||
	if r.IP4 != nil {
 | 
			
		||||
		str = fmt.Sprintf("IP4:%+v, ", *r.IP4)
 | 
			
		||||
	}
 | 
			
		||||
	if r.IP6 != nil {
 | 
			
		||||
		str += fmt.Sprintf("IP6:%+v, ", *r.IP6)
 | 
			
		||||
	}
 | 
			
		||||
	return fmt.Sprintf("%sDNS:%+v", str, r.DNS)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IPConfig contains values necessary to configure an interface
 | 
			
		||||
type IPConfig struct {
 | 
			
		||||
	IP      net.IPNet
 | 
			
		||||
	Gateway net.IP
 | 
			
		||||
	Routes  []types.Route
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// net.IPNet is not JSON (un)marshallable so this duality is needed
 | 
			
		||||
// for our custom IPNet type
 | 
			
		||||
 | 
			
		||||
// JSON (un)marshallable types
 | 
			
		||||
type ipConfig struct {
 | 
			
		||||
	IP      types.IPNet   `json:"ip"`
 | 
			
		||||
	Gateway net.IP        `json:"gateway,omitempty"`
 | 
			
		||||
	Routes  []types.Route `json:"routes,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *IPConfig) MarshalJSON() ([]byte, error) {
 | 
			
		||||
	ipc := ipConfig{
 | 
			
		||||
		IP:      types.IPNet(c.IP),
 | 
			
		||||
		Gateway: c.Gateway,
 | 
			
		||||
		Routes:  c.Routes,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return json.Marshal(ipc)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *IPConfig) UnmarshalJSON(data []byte) error {
 | 
			
		||||
	ipc := ipConfig{}
 | 
			
		||||
	if err := json.Unmarshal(data, &ipc); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c.IP = net.IPNet(ipc.IP)
 | 
			
		||||
	c.Gateway = ipc.Gateway
 | 
			
		||||
	c.Routes = ipc.Routes
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										291
									
								
								vendor/github.com/containernetworking/cni/pkg/types/current/types.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										291
									
								
								vendor/github.com/containernetworking/cni/pkg/types/current/types.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,291 @@
 | 
			
		||||
// Copyright 2016 CNI 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 current
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net"
 | 
			
		||||
	"os"
 | 
			
		||||
 | 
			
		||||
	"github.com/containernetworking/cni/pkg/types"
 | 
			
		||||
	"github.com/containernetworking/cni/pkg/types/020"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const implementedSpecVersion string = "0.3.1"
 | 
			
		||||
 | 
			
		||||
var SupportedVersions = []string{"0.3.0", implementedSpecVersion}
 | 
			
		||||
 | 
			
		||||
func NewResult(data []byte) (types.Result, error) {
 | 
			
		||||
	result := &Result{}
 | 
			
		||||
	if err := json.Unmarshal(data, result); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return result, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetResult(r types.Result) (*Result, error) {
 | 
			
		||||
	resultCurrent, err := r.GetAsVersion(implementedSpecVersion)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	result, ok := resultCurrent.(*Result)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return nil, fmt.Errorf("failed to convert result")
 | 
			
		||||
	}
 | 
			
		||||
	return result, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var resultConverters = []struct {
 | 
			
		||||
	versions []string
 | 
			
		||||
	convert  func(types.Result) (*Result, error)
 | 
			
		||||
}{
 | 
			
		||||
	{types020.SupportedVersions, convertFrom020},
 | 
			
		||||
	{SupportedVersions, convertFrom030},
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func convertFrom020(result types.Result) (*Result, error) {
 | 
			
		||||
	oldResult, err := types020.GetResult(result)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	newResult := &Result{
 | 
			
		||||
		DNS:    oldResult.DNS,
 | 
			
		||||
		Routes: []*types.Route{},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if oldResult.IP4 != nil {
 | 
			
		||||
		newResult.IPs = append(newResult.IPs, &IPConfig{
 | 
			
		||||
			Version:   "4",
 | 
			
		||||
			Interface: -1,
 | 
			
		||||
			Address:   oldResult.IP4.IP,
 | 
			
		||||
			Gateway:   oldResult.IP4.Gateway,
 | 
			
		||||
		})
 | 
			
		||||
		for _, route := range oldResult.IP4.Routes {
 | 
			
		||||
			gw := route.GW
 | 
			
		||||
			if gw == nil {
 | 
			
		||||
				gw = oldResult.IP4.Gateway
 | 
			
		||||
			}
 | 
			
		||||
			newResult.Routes = append(newResult.Routes, &types.Route{
 | 
			
		||||
				Dst: route.Dst,
 | 
			
		||||
				GW:  gw,
 | 
			
		||||
			})
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if oldResult.IP6 != nil {
 | 
			
		||||
		newResult.IPs = append(newResult.IPs, &IPConfig{
 | 
			
		||||
			Version:   "6",
 | 
			
		||||
			Interface: -1,
 | 
			
		||||
			Address:   oldResult.IP6.IP,
 | 
			
		||||
			Gateway:   oldResult.IP6.Gateway,
 | 
			
		||||
		})
 | 
			
		||||
		for _, route := range oldResult.IP6.Routes {
 | 
			
		||||
			gw := route.GW
 | 
			
		||||
			if gw == nil {
 | 
			
		||||
				gw = oldResult.IP6.Gateway
 | 
			
		||||
			}
 | 
			
		||||
			newResult.Routes = append(newResult.Routes, &types.Route{
 | 
			
		||||
				Dst: route.Dst,
 | 
			
		||||
				GW:  gw,
 | 
			
		||||
			})
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(newResult.IPs) == 0 {
 | 
			
		||||
		return nil, fmt.Errorf("cannot convert: no valid IP addresses")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return newResult, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func convertFrom030(result types.Result) (*Result, error) {
 | 
			
		||||
	newResult, ok := result.(*Result)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return nil, fmt.Errorf("failed to convert result")
 | 
			
		||||
	}
 | 
			
		||||
	return newResult, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewResultFromResult(result types.Result) (*Result, error) {
 | 
			
		||||
	version := result.Version()
 | 
			
		||||
	for _, converter := range resultConverters {
 | 
			
		||||
		for _, supportedVersion := range converter.versions {
 | 
			
		||||
			if version == supportedVersion {
 | 
			
		||||
				return converter.convert(result)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil, fmt.Errorf("unsupported CNI result22 version %q", version)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Result is what gets returned from the plugin (via stdout) to the caller
 | 
			
		||||
type Result struct {
 | 
			
		||||
	Interfaces []*Interface   `json:"interfaces,omitempty"`
 | 
			
		||||
	IPs        []*IPConfig    `json:"ips,omitempty"`
 | 
			
		||||
	Routes     []*types.Route `json:"routes,omitempty"`
 | 
			
		||||
	DNS        types.DNS      `json:"dns,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert to the older 0.2.0 CNI spec Result type
 | 
			
		||||
func (r *Result) convertTo020() (*types020.Result, error) {
 | 
			
		||||
	oldResult := &types020.Result{
 | 
			
		||||
		DNS: r.DNS,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, ip := range r.IPs {
 | 
			
		||||
		// Only convert the first IP address of each version as 0.2.0
 | 
			
		||||
		// and earlier cannot handle multiple IP addresses
 | 
			
		||||
		if ip.Version == "4" && oldResult.IP4 == nil {
 | 
			
		||||
			oldResult.IP4 = &types020.IPConfig{
 | 
			
		||||
				IP:      ip.Address,
 | 
			
		||||
				Gateway: ip.Gateway,
 | 
			
		||||
			}
 | 
			
		||||
		} else if ip.Version == "6" && oldResult.IP6 == nil {
 | 
			
		||||
			oldResult.IP6 = &types020.IPConfig{
 | 
			
		||||
				IP:      ip.Address,
 | 
			
		||||
				Gateway: ip.Gateway,
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if oldResult.IP4 != nil && oldResult.IP6 != nil {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, route := range r.Routes {
 | 
			
		||||
		is4 := route.Dst.IP.To4() != nil
 | 
			
		||||
		if is4 && oldResult.IP4 != nil {
 | 
			
		||||
			oldResult.IP4.Routes = append(oldResult.IP4.Routes, types.Route{
 | 
			
		||||
				Dst: route.Dst,
 | 
			
		||||
				GW:  route.GW,
 | 
			
		||||
			})
 | 
			
		||||
		} else if !is4 && oldResult.IP6 != nil {
 | 
			
		||||
			oldResult.IP6.Routes = append(oldResult.IP6.Routes, types.Route{
 | 
			
		||||
				Dst: route.Dst,
 | 
			
		||||
				GW:  route.GW,
 | 
			
		||||
			})
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if oldResult.IP4 == nil && oldResult.IP6 == nil {
 | 
			
		||||
		return nil, fmt.Errorf("cannot convert: no valid IP addresses")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return oldResult, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *Result) Version() string {
 | 
			
		||||
	return implementedSpecVersion
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *Result) GetAsVersion(version string) (types.Result, error) {
 | 
			
		||||
	switch version {
 | 
			
		||||
	case "0.3.0", implementedSpecVersion:
 | 
			
		||||
		return r, nil
 | 
			
		||||
	case types020.SupportedVersions[0], types020.SupportedVersions[1], types020.SupportedVersions[2]:
 | 
			
		||||
		return r.convertTo020()
 | 
			
		||||
	}
 | 
			
		||||
	return nil, fmt.Errorf("cannot convert version 0.3.x to %q", version)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *Result) Print() error {
 | 
			
		||||
	data, err := json.MarshalIndent(r, "", "    ")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	_, err = os.Stdout.Write(data)
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// String returns a formatted string in the form of "[Interfaces: $1,][ IP: $2,] DNS: $3" where
 | 
			
		||||
// $1 represents the receiver's Interfaces, $2 represents the receiver's IP addresses and $3 the
 | 
			
		||||
// receiver's DNS. If $1 or $2 are nil, they won't be present in the returned string.
 | 
			
		||||
func (r *Result) String() string {
 | 
			
		||||
	var str string
 | 
			
		||||
	if len(r.Interfaces) > 0 {
 | 
			
		||||
		str += fmt.Sprintf("Interfaces:%+v, ", r.Interfaces)
 | 
			
		||||
	}
 | 
			
		||||
	if len(r.IPs) > 0 {
 | 
			
		||||
		str += fmt.Sprintf("IP:%+v, ", r.IPs)
 | 
			
		||||
	}
 | 
			
		||||
	if len(r.Routes) > 0 {
 | 
			
		||||
		str += fmt.Sprintf("Routes:%+v, ", r.Routes)
 | 
			
		||||
	}
 | 
			
		||||
	return fmt.Sprintf("%sDNS:%+v", str, r.DNS)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert this old version result to the current CNI version result
 | 
			
		||||
func (r *Result) Convert() (*Result, error) {
 | 
			
		||||
	return r, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Interface contains values about the created interfaces
 | 
			
		||||
type Interface struct {
 | 
			
		||||
	Name    string `json:"name"`
 | 
			
		||||
	Mac     string `json:"mac,omitempty"`
 | 
			
		||||
	Sandbox string `json:"sandbox,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (i *Interface) String() string {
 | 
			
		||||
	return fmt.Sprintf("%+v", *i)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IPConfig contains values necessary to configure an IP address on an interface
 | 
			
		||||
type IPConfig struct {
 | 
			
		||||
	// IP version, either "4" or "6"
 | 
			
		||||
	Version string
 | 
			
		||||
	// Index into Result structs Interfaces list
 | 
			
		||||
	Interface int
 | 
			
		||||
	Address   net.IPNet
 | 
			
		||||
	Gateway   net.IP
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (i *IPConfig) String() string {
 | 
			
		||||
	return fmt.Sprintf("%+v", *i)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// JSON (un)marshallable types
 | 
			
		||||
type ipConfig struct {
 | 
			
		||||
	Version   string      `json:"version"`
 | 
			
		||||
	Interface int         `json:"interface,omitempty"`
 | 
			
		||||
	Address   types.IPNet `json:"address"`
 | 
			
		||||
	Gateway   net.IP      `json:"gateway,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *IPConfig) MarshalJSON() ([]byte, error) {
 | 
			
		||||
	ipc := ipConfig{
 | 
			
		||||
		Version:   c.Version,
 | 
			
		||||
		Interface: c.Interface,
 | 
			
		||||
		Address:   types.IPNet(c.Address),
 | 
			
		||||
		Gateway:   c.Gateway,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return json.Marshal(ipc)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *IPConfig) UnmarshalJSON(data []byte) error {
 | 
			
		||||
	ipc := ipConfig{}
 | 
			
		||||
	if err := json.Unmarshal(data, &ipc); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c.Version = ipc.Version
 | 
			
		||||
	c.Interface = ipc.Interface
 | 
			
		||||
	c.Address = net.IPNet(ipc.Address)
 | 
			
		||||
	c.Gateway = ipc.Gateway
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										100
									
								
								vendor/github.com/containernetworking/cni/pkg/types/types.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										100
									
								
								vendor/github.com/containernetworking/cni/pkg/types/types.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -16,6 +16,7 @@ package types
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net"
 | 
			
		||||
	"os"
 | 
			
		||||
@@ -57,44 +58,50 @@ func (n *IPNet) UnmarshalJSON(data []byte) error {
 | 
			
		||||
 | 
			
		||||
// NetConf describes a network.
 | 
			
		||||
type NetConf struct {
 | 
			
		||||
	CNIVersion string `json:"cniVersion,omitempty"`
 | 
			
		||||
 | 
			
		||||
	Name         string          `json:"name,omitempty"`
 | 
			
		||||
	Type         string          `json:"type,omitempty"`
 | 
			
		||||
	Capabilities map[string]bool `json:"capabilities,omitempty"`
 | 
			
		||||
	IPAM         struct {
 | 
			
		||||
		Type string `json:"type,omitempty"`
 | 
			
		||||
	} `json:"ipam,omitempty"`
 | 
			
		||||
	DNS DNS `json:"dns"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Result is what gets returned from the plugin (via stdout) to the caller
 | 
			
		||||
type Result struct {
 | 
			
		||||
	IP4 *IPConfig `json:"ip4,omitempty"`
 | 
			
		||||
	IP6 *IPConfig `json:"ip6,omitempty"`
 | 
			
		||||
	DNS DNS       `json:"dns,omitempty"`
 | 
			
		||||
// NetConfList describes an ordered list of networks.
 | 
			
		||||
type NetConfList struct {
 | 
			
		||||
	CNIVersion string `json:"cniVersion,omitempty"`
 | 
			
		||||
 | 
			
		||||
	Name    string     `json:"name,omitempty"`
 | 
			
		||||
	Plugins []*NetConf `json:"plugins,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *Result) Print() error {
 | 
			
		||||
	return prettyPrint(r)
 | 
			
		||||
type ResultFactoryFunc func([]byte) (Result, error)
 | 
			
		||||
 | 
			
		||||
// Result is an interface that provides the result of plugin execution
 | 
			
		||||
type Result interface {
 | 
			
		||||
	// The highest CNI specification result verison the result supports
 | 
			
		||||
	// without having to convert
 | 
			
		||||
	Version() string
 | 
			
		||||
 | 
			
		||||
	// Returns the result converted into the requested CNI specification
 | 
			
		||||
	// result version, or an error if conversion failed
 | 
			
		||||
	GetAsVersion(version string) (Result, error)
 | 
			
		||||
 | 
			
		||||
	// Prints the result in JSON format to stdout
 | 
			
		||||
	Print() error
 | 
			
		||||
 | 
			
		||||
	// Returns a JSON string representation of the result
 | 
			
		||||
	String() string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// String returns a formatted string in the form of "[IP4: $1,][ IP6: $2,] DNS: $3" where
 | 
			
		||||
// $1 represents the receiver's IPv4, $2 represents the receiver's IPv6 and $3 the
 | 
			
		||||
// receiver's DNS. If $1 or $2 are nil, they won't be present in the returned string.
 | 
			
		||||
func (r *Result) String() string {
 | 
			
		||||
	var str string
 | 
			
		||||
	if r.IP4 != nil {
 | 
			
		||||
		str = fmt.Sprintf("IP4:%+v, ", *r.IP4)
 | 
			
		||||
func PrintResult(result Result, version string) error {
 | 
			
		||||
	newResult, err := result.GetAsVersion(version)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if r.IP6 != nil {
 | 
			
		||||
		str += fmt.Sprintf("IP6:%+v, ", *r.IP6)
 | 
			
		||||
	}
 | 
			
		||||
	return fmt.Sprintf("%sDNS:%+v", str, r.DNS)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IPConfig contains values necessary to configure an interface
 | 
			
		||||
type IPConfig struct {
 | 
			
		||||
	IP      net.IPNet
 | 
			
		||||
	Gateway net.IP
 | 
			
		||||
	Routes  []Route
 | 
			
		||||
	return newResult.Print()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DNS contains values interesting for DNS resolvers
 | 
			
		||||
@@ -110,6 +117,18 @@ type Route struct {
 | 
			
		||||
	GW  net.IP
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *Route) String() string {
 | 
			
		||||
	return fmt.Sprintf("%+v", *r)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Well known error codes
 | 
			
		||||
// see https://github.com/containernetworking/cni/blob/master/SPEC.md#well-known-error-codes
 | 
			
		||||
const (
 | 
			
		||||
	ErrUnknown                uint = iota // 0
 | 
			
		||||
	ErrIncompatibleCNIVersion             // 1
 | 
			
		||||
	ErrUnsupportedField                   // 2
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type Error struct {
 | 
			
		||||
	Code    uint   `json:"code"`
 | 
			
		||||
	Msg     string `json:"msg"`
 | 
			
		||||
@@ -128,39 +147,11 @@ func (e *Error) Print() error {
 | 
			
		||||
// for our custom IPNet type
 | 
			
		||||
 | 
			
		||||
// JSON (un)marshallable types
 | 
			
		||||
type ipConfig struct {
 | 
			
		||||
	IP      IPNet   `json:"ip"`
 | 
			
		||||
	Gateway net.IP  `json:"gateway,omitempty"`
 | 
			
		||||
	Routes  []Route `json:"routes,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type route struct {
 | 
			
		||||
	Dst IPNet  `json:"dst"`
 | 
			
		||||
	GW  net.IP `json:"gw,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *IPConfig) MarshalJSON() ([]byte, error) {
 | 
			
		||||
	ipc := ipConfig{
 | 
			
		||||
		IP:      IPNet(c.IP),
 | 
			
		||||
		Gateway: c.Gateway,
 | 
			
		||||
		Routes:  c.Routes,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return json.Marshal(ipc)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *IPConfig) UnmarshalJSON(data []byte) error {
 | 
			
		||||
	ipc := ipConfig{}
 | 
			
		||||
	if err := json.Unmarshal(data, &ipc); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c.IP = net.IPNet(ipc.IP)
 | 
			
		||||
	c.Gateway = ipc.Gateway
 | 
			
		||||
	c.Routes = ipc.Routes
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *Route) UnmarshalJSON(data []byte) error {
 | 
			
		||||
	rt := route{}
 | 
			
		||||
	if err := json.Unmarshal(data, &rt); err != nil {
 | 
			
		||||
@@ -189,3 +180,6 @@ func prettyPrint(obj interface{}) error {
 | 
			
		||||
	_, err = os.Stdout.Write(data)
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NotImplementedError is used to indicate that a method is not implemented for the given platform
 | 
			
		||||
var NotImplementedError = errors.New("Not Implemented")
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										37
									
								
								vendor/github.com/containernetworking/cni/pkg/version/conf.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								vendor/github.com/containernetworking/cni/pkg/version/conf.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,37 @@
 | 
			
		||||
// Copyright 2016 CNI 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 version
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// ConfigDecoder can decode the CNI version available in network config data
 | 
			
		||||
type ConfigDecoder struct{}
 | 
			
		||||
 | 
			
		||||
func (*ConfigDecoder) Decode(jsonBytes []byte) (string, error) {
 | 
			
		||||
	var conf struct {
 | 
			
		||||
		CNIVersion string `json:"cniVersion"`
 | 
			
		||||
	}
 | 
			
		||||
	err := json.Unmarshal(jsonBytes, &conf)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return "", fmt.Errorf("decoding version from network config: %s", err)
 | 
			
		||||
	}
 | 
			
		||||
	if conf.CNIVersion == "" {
 | 
			
		||||
		return "0.1.0", nil
 | 
			
		||||
	}
 | 
			
		||||
	return conf.CNIVersion, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										81
									
								
								vendor/github.com/containernetworking/cni/pkg/version/plugin.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								vendor/github.com/containernetworking/cni/pkg/version/plugin.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,81 @@
 | 
			
		||||
// Copyright 2016 CNI 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 version
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// PluginInfo reports information about CNI versioning
 | 
			
		||||
type PluginInfo interface {
 | 
			
		||||
	// SupportedVersions returns one or more CNI spec versions that the plugin
 | 
			
		||||
	// supports.  If input is provided in one of these versions, then the plugin
 | 
			
		||||
	// promises to use the same CNI version in its response
 | 
			
		||||
	SupportedVersions() []string
 | 
			
		||||
 | 
			
		||||
	// Encode writes this CNI version information as JSON to the given Writer
 | 
			
		||||
	Encode(io.Writer) error
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type pluginInfo struct {
 | 
			
		||||
	CNIVersion_        string   `json:"cniVersion"`
 | 
			
		||||
	SupportedVersions_ []string `json:"supportedVersions,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// pluginInfo implements the PluginInfo interface
 | 
			
		||||
var _ PluginInfo = &pluginInfo{}
 | 
			
		||||
 | 
			
		||||
func (p *pluginInfo) Encode(w io.Writer) error {
 | 
			
		||||
	return json.NewEncoder(w).Encode(p)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *pluginInfo) SupportedVersions() []string {
 | 
			
		||||
	return p.SupportedVersions_
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// PluginSupports returns a new PluginInfo that will report the given versions
 | 
			
		||||
// as supported
 | 
			
		||||
func PluginSupports(supportedVersions ...string) PluginInfo {
 | 
			
		||||
	if len(supportedVersions) < 1 {
 | 
			
		||||
		panic("programmer error: you must support at least one version")
 | 
			
		||||
	}
 | 
			
		||||
	return &pluginInfo{
 | 
			
		||||
		CNIVersion_:        Current(),
 | 
			
		||||
		SupportedVersions_: supportedVersions,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// PluginDecoder can decode the response returned by a plugin's VERSION command
 | 
			
		||||
type PluginDecoder struct{}
 | 
			
		||||
 | 
			
		||||
func (*PluginDecoder) Decode(jsonBytes []byte) (PluginInfo, error) {
 | 
			
		||||
	var info pluginInfo
 | 
			
		||||
	err := json.Unmarshal(jsonBytes, &info)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("decoding version info: %s", err)
 | 
			
		||||
	}
 | 
			
		||||
	if info.CNIVersion_ == "" {
 | 
			
		||||
		return nil, fmt.Errorf("decoding version info: missing field cniVersion")
 | 
			
		||||
	}
 | 
			
		||||
	if len(info.SupportedVersions_) == 0 {
 | 
			
		||||
		if info.CNIVersion_ == "0.2.0" {
 | 
			
		||||
			return PluginSupports("0.1.0", "0.2.0"), nil
 | 
			
		||||
		}
 | 
			
		||||
		return nil, fmt.Errorf("decoding version info: missing field supportedVersions")
 | 
			
		||||
	}
 | 
			
		||||
	return &info, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										49
									
								
								vendor/github.com/containernetworking/cni/pkg/version/reconcile.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								vendor/github.com/containernetworking/cni/pkg/version/reconcile.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,49 @@
 | 
			
		||||
// Copyright 2016 CNI 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 version
 | 
			
		||||
 | 
			
		||||
import "fmt"
 | 
			
		||||
 | 
			
		||||
type ErrorIncompatible struct {
 | 
			
		||||
	Config    string
 | 
			
		||||
	Supported []string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e *ErrorIncompatible) Details() string {
 | 
			
		||||
	return fmt.Sprintf("config is %q, plugin supports %q", e.Config, e.Supported)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e *ErrorIncompatible) Error() string {
 | 
			
		||||
	return fmt.Sprintf("incompatible CNI versions: %s", e.Details())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type Reconciler struct{}
 | 
			
		||||
 | 
			
		||||
func (r *Reconciler) Check(configVersion string, pluginInfo PluginInfo) *ErrorIncompatible {
 | 
			
		||||
	return r.CheckRaw(configVersion, pluginInfo.SupportedVersions())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (*Reconciler) CheckRaw(configVersion string, supportedVersions []string) *ErrorIncompatible {
 | 
			
		||||
	for _, supportedVersion := range supportedVersions {
 | 
			
		||||
		if configVersion == supportedVersion {
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &ErrorIncompatible{
 | 
			
		||||
		Config:    configVersion,
 | 
			
		||||
		Supported: supportedVersions,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										61
									
								
								vendor/github.com/containernetworking/cni/pkg/version/version.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								vendor/github.com/containernetworking/cni/pkg/version/version.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,61 @@
 | 
			
		||||
// Copyright 2016 CNI 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 version
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
 | 
			
		||||
	"github.com/containernetworking/cni/pkg/types"
 | 
			
		||||
	"github.com/containernetworking/cni/pkg/types/020"
 | 
			
		||||
	"github.com/containernetworking/cni/pkg/types/current"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Current reports the version of the CNI spec implemented by this library
 | 
			
		||||
func Current() string {
 | 
			
		||||
	return "0.3.1"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Legacy PluginInfo describes a plugin that is backwards compatible with the
 | 
			
		||||
// CNI spec version 0.1.0.  In particular, a runtime compiled against the 0.1.0
 | 
			
		||||
// library ought to work correctly with a plugin that reports support for
 | 
			
		||||
// Legacy versions.
 | 
			
		||||
//
 | 
			
		||||
// Any future CNI spec versions which meet this definition should be added to
 | 
			
		||||
// this list.
 | 
			
		||||
var Legacy = PluginSupports("0.1.0", "0.2.0")
 | 
			
		||||
var All = PluginSupports("0.1.0", "0.2.0", "0.3.0", "0.3.1")
 | 
			
		||||
 | 
			
		||||
var resultFactories = []struct {
 | 
			
		||||
	supportedVersions []string
 | 
			
		||||
	newResult         types.ResultFactoryFunc
 | 
			
		||||
}{
 | 
			
		||||
	{current.SupportedVersions, current.NewResult},
 | 
			
		||||
	{types020.SupportedVersions, types020.NewResult},
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Finds a Result object matching the requested version (if any) and asks
 | 
			
		||||
// that object to parse the plugin result, returning an error if parsing failed.
 | 
			
		||||
func NewResult(version string, resultBytes []byte) (types.Result, error) {
 | 
			
		||||
	reconciler := &Reconciler{}
 | 
			
		||||
	for _, resultFactory := range resultFactories {
 | 
			
		||||
		err := reconciler.CheckRaw(version, resultFactory.supportedVersions)
 | 
			
		||||
		if err == nil {
 | 
			
		||||
			// Result supports this version
 | 
			
		||||
			return resultFactory.newResult(resultBytes)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil, fmt.Errorf("unsupported CNI result version %q", version)
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user