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",
 | 
								"ImportPath": "github.com/containernetworking/cni/libcni",
 | 
				
			||||||
			"Comment": "v0.3.0-61-g9d5e6e6",
 | 
								"Comment": "v0.5.2",
 | 
				
			||||||
			"Rev": "9d5e6e60e79491207834ae8439e80c943db65a69"
 | 
								"Rev": "137b4975ecab6e1f0c24c1e3c228a50a3cfba75e"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/containernetworking/cni/pkg/invoke",
 | 
								"ImportPath": "github.com/containernetworking/cni/pkg/invoke",
 | 
				
			||||||
			"Comment": "v0.3.0-61-g9d5e6e6",
 | 
								"Comment": "v0.5.2",
 | 
				
			||||||
			"Rev": "9d5e6e60e79491207834ae8439e80c943db65a69"
 | 
								"Rev": "137b4975ecab6e1f0c24c1e3c228a50a3cfba75e"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/containernetworking/cni/pkg/types",
 | 
								"ImportPath": "github.com/containernetworking/cni/pkg/types",
 | 
				
			||||||
			"Comment": "v0.3.0-61-g9d5e6e6",
 | 
								"Comment": "v0.5.2",
 | 
				
			||||||
			"Rev": "9d5e6e60e79491207834ae8439e80c943db65a69"
 | 
								"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",
 | 
								"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: =
 | 
					= 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
 | 
					package libcni
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/containernetworking/cni/pkg/invoke"
 | 
						"github.com/containernetworking/cni/pkg/invoke"
 | 
				
			||||||
	"github.com/containernetworking/cni/pkg/types"
 | 
						"github.com/containernetworking/cni/pkg/types"
 | 
				
			||||||
 | 
						"github.com/containernetworking/cni/pkg/version"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type RuntimeConf struct {
 | 
					type RuntimeConf struct {
 | 
				
			||||||
@@ -26,6 +28,12 @@ type RuntimeConf struct {
 | 
				
			|||||||
	NetNS       string
 | 
						NetNS       string
 | 
				
			||||||
	IfName      string
 | 
						IfName      string
 | 
				
			||||||
	Args        [][2]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 {
 | 
					type NetworkConfig struct {
 | 
				
			||||||
@@ -33,8 +41,18 @@ type NetworkConfig struct {
 | 
				
			|||||||
	Bytes   []byte
 | 
						Bytes   []byte
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type NetworkConfigList struct {
 | 
				
			||||||
 | 
						Name       string
 | 
				
			||||||
 | 
						CNIVersion string
 | 
				
			||||||
 | 
						Plugins    []*NetworkConfig
 | 
				
			||||||
 | 
						Bytes      []byte
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type CNI interface {
 | 
					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
 | 
						DelNetwork(net *NetworkConfig, rt *RuntimeConf) error
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -42,24 +60,152 @@ type CNIConfig struct {
 | 
				
			|||||||
	Path []string
 | 
						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)
 | 
						pluginPath, err := invoke.FindInPath(net.Network.Type, c.Path)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						net, err = injectRuntimeConfig(net, rt)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return invoke.ExecPluginWithResult(pluginPath, net.Bytes, c.args("ADD", rt))
 | 
						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 {
 | 
					func (c *CNIConfig) DelNetwork(net *NetworkConfig, rt *RuntimeConf) error {
 | 
				
			||||||
	pluginPath, err := invoke.FindInPath(net.Network.Type, c.Path)
 | 
						pluginPath, err := invoke.FindInPath(net.Network.Type, c.Path)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						net, err = injectRuntimeConfig(net, rt)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return invoke.ExecPluginWithoutResult(pluginPath, net.Bytes, c.args("DEL", rt))
 | 
						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 {
 | 
					func (c *CNIConfig) args(action string, rt *RuntimeConf) *invoke.Args {
 | 
				
			||||||
	return &invoke.Args{
 | 
						return &invoke.Args{
 | 
				
			||||||
@@ -68,6 +214,6 @@ func (c *CNIConfig) args(action string, rt *RuntimeConf) *invoke.Args {
 | 
				
			|||||||
		NetNS:       rt.NetNS,
 | 
							NetNS:       rt.NetNS,
 | 
				
			||||||
		PluginArgs:  rt.Args,
 | 
							PluginArgs:  rt.Args,
 | 
				
			||||||
		IfName:      rt.IfName,
 | 
							IfName:      rt.IfName,
 | 
				
			||||||
		Path:        strings.Join(c.Path, ":"),
 | 
							Path:        strings.Join(c.Path, string(os.PathListSeparator)),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										174
									
								
								vendor/github.com/containernetworking/cni/libcni/conf.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										174
									
								
								vendor/github.com/containernetworking/cni/libcni/conf.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -23,6 +23,23 @@ import (
 | 
				
			|||||||
	"sort"
 | 
						"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) {
 | 
					func ConfFromBytes(bytes []byte) (*NetworkConfig, error) {
 | 
				
			||||||
	conf := &NetworkConfig{Bytes: bytes}
 | 
						conf := &NetworkConfig{Bytes: bytes}
 | 
				
			||||||
	if err := json.Unmarshal(bytes, &conf.Network); err != nil {
 | 
						if err := json.Unmarshal(bytes, &conf.Network); err != nil {
 | 
				
			||||||
@@ -39,7 +56,73 @@ func ConfFromFile(filename string) (*NetworkConfig, error) {
 | 
				
			|||||||
	return ConfFromBytes(bytes)
 | 
						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
 | 
						// In part, adapted from rkt/networking/podenv.go#listFiles
 | 
				
			||||||
	files, err := ioutil.ReadDir(dir)
 | 
						files, err := ioutil.ReadDir(dir)
 | 
				
			||||||
	switch {
 | 
						switch {
 | 
				
			||||||
@@ -55,20 +138,23 @@ func ConfFiles(dir string) ([]string, error) {
 | 
				
			|||||||
		if f.IsDir() {
 | 
							if f.IsDir() {
 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if filepath.Ext(f.Name()) == ".conf" {
 | 
							fileExt := filepath.Ext(f.Name())
 | 
				
			||||||
			confFiles = append(confFiles, filepath.Join(dir, f.Name()))
 | 
							for _, ext := range extensions {
 | 
				
			||||||
 | 
								if fileExt == ext {
 | 
				
			||||||
 | 
									confFiles = append(confFiles, filepath.Join(dir, f.Name()))
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return confFiles, nil
 | 
						return confFiles, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func LoadConf(dir, name string) (*NetworkConfig, error) {
 | 
					func LoadConf(dir, name string) (*NetworkConfig, error) {
 | 
				
			||||||
	files, err := ConfFiles(dir)
 | 
						files, err := ConfFiles(dir, []string{".conf", ".json"})
 | 
				
			||||||
	switch {
 | 
						switch {
 | 
				
			||||||
	case err != nil:
 | 
						case err != nil:
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	case len(files) == 0:
 | 
						case len(files) == 0:
 | 
				
			||||||
		return nil, fmt.Errorf("no net configurations found")
 | 
							return nil, NoConfigsFoundError{Dir: dir}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	sort.Strings(files)
 | 
						sort.Strings(files)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -81,25 +167,59 @@ func LoadConf(dir, name string) (*NetworkConfig, error) {
 | 
				
			|||||||
			return conf, nil
 | 
								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{})
 | 
						config := make(map[string]interface{})
 | 
				
			||||||
	err := json.Unmarshal(original.Bytes, &config)
 | 
						err := json.Unmarshal(original.Bytes, &config)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, fmt.Errorf("unmarshal existing network bytes: %s", err)
 | 
							return nil, fmt.Errorf("unmarshal existing network bytes: %s", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if key == "" {
 | 
						for key, value := range newValues {
 | 
				
			||||||
		return nil, fmt.Errorf("key value can not be empty")
 | 
							if key == "" {
 | 
				
			||||||
	}
 | 
								return nil, fmt.Errorf("keys cannot be empty")
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if newValue == nil {
 | 
							if value == nil {
 | 
				
			||||||
		return nil, fmt.Errorf("newValue must be specified")
 | 
								return nil, fmt.Errorf("key '%s' value must not be nil", key)
 | 
				
			||||||
	}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	config[key] = newValue
 | 
							config[key] = value
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	newBytes, err := json.Marshal(config)
 | 
						newBytes, err := json.Marshal(config)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
@@ -108,3 +228,29 @@ func InjectConf(original *NetworkConfig, key string, newValue interface{}) (*Net
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	return ConfFromBytes(newBytes)
 | 
						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
 | 
						Path          string
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Args implements the CNIArgs interface
 | 
				
			||||||
 | 
					var _ CNIArgs = &Args{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (args *Args) AsEnv() []string {
 | 
					func (args *Args) AsEnv() []string {
 | 
				
			||||||
	env := os.Environ()
 | 
						env := os.Environ()
 | 
				
			||||||
	pluginArgsStr := args.PluginArgsStr
 | 
						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 (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
	"strings"
 | 
						"path/filepath"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/containernetworking/cni/pkg/types"
 | 
						"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" {
 | 
						if os.Getenv("CNI_COMMAND") != "ADD" {
 | 
				
			||||||
		return nil, fmt.Errorf("CNI_COMMAND is not 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)
 | 
						pluginPath, err := FindInPath(delegatePlugin, paths)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
@@ -42,7 +42,7 @@ func DelegateDel(delegatePlugin string, netconf []byte) error {
 | 
				
			|||||||
		return fmt.Errorf("CNI_COMMAND is not DEL")
 | 
							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)
 | 
						pluginPath, err := FindInPath(delegatePlugin, paths)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										92
									
								
								vendor/github.com/containernetworking/cni/pkg/invoke/exec.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										92
									
								
								vendor/github.com/containernetworking/cni/pkg/invoke/exec.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -15,61 +15,81 @@
 | 
				
			|||||||
package invoke
 | 
					package invoke
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"bytes"
 | 
					 | 
				
			||||||
	"encoding/json"
 | 
					 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
	"os/exec"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/containernetworking/cni/pkg/types"
 | 
						"github.com/containernetworking/cni/pkg/types"
 | 
				
			||||||
 | 
						"github.com/containernetworking/cni/pkg/version"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func pluginErr(err error, output []byte) error {
 | 
					func ExecPluginWithResult(pluginPath string, netconf []byte, args CNIArgs) (types.Result, error) {
 | 
				
			||||||
	if _, ok := err.(*exec.ExitError); ok {
 | 
						return defaultPluginExec.WithResult(pluginPath, netconf, args)
 | 
				
			||||||
		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
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func ExecPluginWithResult(pluginPath string, netconf []byte, args CNIArgs) (*types.Result, error) {
 | 
					func ExecPluginWithoutResult(pluginPath string, netconf []byte, args CNIArgs) error {
 | 
				
			||||||
	stdoutBytes, err := execPlugin(pluginPath, netconf, args)
 | 
						return defaultPluginExec.WithoutResult(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 {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	res := &types.Result{}
 | 
						// Plugin must return result in same version as specified in netconf
 | 
				
			||||||
	err = json.Unmarshal(stdoutBytes, res)
 | 
						versionDecoder := &version.ConfigDecoder{}
 | 
				
			||||||
	return res, err
 | 
						confVersion, err := versionDecoder.Decode(netconf)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return version.NewResult(confVersion, stdoutBytes)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func ExecPluginWithoutResult(pluginPath string, netconf []byte, args CNIArgs) error {
 | 
					func (e *PluginExec) WithoutResult(pluginPath string, netconf []byte, args CNIArgs) error {
 | 
				
			||||||
	_, err := execPlugin(pluginPath, netconf, args)
 | 
						_, err := e.RawExec.ExecPlugin(pluginPath, netconf, args.AsEnv())
 | 
				
			||||||
	return err
 | 
						return err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func execPlugin(pluginPath string, netconf []byte, args CNIArgs) ([]byte, error) {
 | 
					// GetVersionInfo returns the version information available about the plugin.
 | 
				
			||||||
	stdout := &bytes.Buffer{}
 | 
					// 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{
 | 
							// set fake values required by plugins built against an older version of skel
 | 
				
			||||||
		Env:    args.AsEnv(),
 | 
							NetNS:  "dummy",
 | 
				
			||||||
		Path:   pluginPath,
 | 
							IfName: "dummy",
 | 
				
			||||||
		Args:   []string{pluginPath},
 | 
							Path:   "dummy",
 | 
				
			||||||
		Stdin:  bytes.NewBuffer(netconf),
 | 
					 | 
				
			||||||
		Stdout: stdout,
 | 
					 | 
				
			||||||
		Stderr: os.Stderr,
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if err := c.Run(); err != nil {
 | 
						stdin := []byte(fmt.Sprintf(`{"cniVersion":%q}`, version.Current()))
 | 
				
			||||||
		return nil, pluginErr(err, stdout.Bytes())
 | 
						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)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								vendor/github.com/containernetworking/cni/pkg/invoke/find.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								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")
 | 
							return "", fmt.Errorf("no paths provided")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var fullpath string
 | 
					 | 
				
			||||||
	for _, path := range paths {
 | 
						for _, path := range paths {
 | 
				
			||||||
		full := filepath.Join(path, plugin)
 | 
							for _, fe := range ExecutableFileExtensions {
 | 
				
			||||||
		if fi, err := os.Stat(full); err == nil && fi.Mode().IsRegular() {
 | 
								fullpath := filepath.Join(path, plugin) + fe
 | 
				
			||||||
			fullpath = full
 | 
								if fi, err := os.Stat(fullpath); err == nil && fi.Mode().IsRegular() {
 | 
				
			||||||
			break
 | 
									return fullpath, nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if fullpath == "" {
 | 
						return "", fmt.Errorf("failed to find plugin %q in path %s", plugin, paths)
 | 
				
			||||||
		return "", fmt.Errorf("failed to find plugin %q in path %s", plugin, paths)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return fullpath, nil
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										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
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										106
									
								
								vendor/github.com/containernetworking/cni/pkg/types/types.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										106
									
								
								vendor/github.com/containernetworking/cni/pkg/types/types.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -16,6 +16,7 @@ package types
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"encoding/json"
 | 
						"encoding/json"
 | 
				
			||||||
 | 
						"errors"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"net"
 | 
						"net"
 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
@@ -57,44 +58,50 @@ func (n *IPNet) UnmarshalJSON(data []byte) error {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// NetConf describes a network.
 | 
					// NetConf describes a network.
 | 
				
			||||||
type NetConf struct {
 | 
					type NetConf struct {
 | 
				
			||||||
	Name string `json:"name,omitempty"`
 | 
						CNIVersion string `json:"cniVersion,omitempty"`
 | 
				
			||||||
	Type string `json:"type,omitempty"`
 | 
					
 | 
				
			||||||
	IPAM struct {
 | 
						Name         string          `json:"name,omitempty"`
 | 
				
			||||||
 | 
						Type         string          `json:"type,omitempty"`
 | 
				
			||||||
 | 
						Capabilities map[string]bool `json:"capabilities,omitempty"`
 | 
				
			||||||
 | 
						IPAM         struct {
 | 
				
			||||||
		Type string `json:"type,omitempty"`
 | 
							Type string `json:"type,omitempty"`
 | 
				
			||||||
	} `json:"ipam,omitempty"`
 | 
						} `json:"ipam,omitempty"`
 | 
				
			||||||
	DNS DNS `json:"dns"`
 | 
						DNS DNS `json:"dns"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Result is what gets returned from the plugin (via stdout) to the caller
 | 
					// NetConfList describes an ordered list of networks.
 | 
				
			||||||
type Result struct {
 | 
					type NetConfList struct {
 | 
				
			||||||
	IP4 *IPConfig `json:"ip4,omitempty"`
 | 
						CNIVersion string `json:"cniVersion,omitempty"`
 | 
				
			||||||
	IP6 *IPConfig `json:"ip6,omitempty"`
 | 
					
 | 
				
			||||||
	DNS DNS       `json:"dns,omitempty"`
 | 
						Name    string     `json:"name,omitempty"`
 | 
				
			||||||
 | 
						Plugins []*NetConf `json:"plugins,omitempty"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (r *Result) Print() error {
 | 
					type ResultFactoryFunc func([]byte) (Result, error)
 | 
				
			||||||
	return prettyPrint(r)
 | 
					
 | 
				
			||||||
 | 
					// 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
 | 
					func PrintResult(result Result, version string) error {
 | 
				
			||||||
// $1 represents the receiver's IPv4, $2 represents the receiver's IPv6 and $3 the
 | 
						newResult, err := result.GetAsVersion(version)
 | 
				
			||||||
// receiver's DNS. If $1 or $2 are nil, they won't be present in the returned string.
 | 
						if err != nil {
 | 
				
			||||||
func (r *Result) String() string {
 | 
							return err
 | 
				
			||||||
	var str string
 | 
					 | 
				
			||||||
	if r.IP4 != nil {
 | 
					 | 
				
			||||||
		str = fmt.Sprintf("IP4:%+v, ", *r.IP4)
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if r.IP6 != nil {
 | 
						return newResult.Print()
 | 
				
			||||||
		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
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// DNS contains values interesting for DNS resolvers
 | 
					// DNS contains values interesting for DNS resolvers
 | 
				
			||||||
@@ -110,6 +117,18 @@ type Route struct {
 | 
				
			|||||||
	GW  net.IP
 | 
						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 {
 | 
					type Error struct {
 | 
				
			||||||
	Code    uint   `json:"code"`
 | 
						Code    uint   `json:"code"`
 | 
				
			||||||
	Msg     string `json:"msg"`
 | 
						Msg     string `json:"msg"`
 | 
				
			||||||
@@ -128,39 +147,11 @@ func (e *Error) Print() error {
 | 
				
			|||||||
// for our custom IPNet type
 | 
					// for our custom IPNet type
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// JSON (un)marshallable types
 | 
					// 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 {
 | 
					type route struct {
 | 
				
			||||||
	Dst IPNet  `json:"dst"`
 | 
						Dst IPNet  `json:"dst"`
 | 
				
			||||||
	GW  net.IP `json:"gw,omitempty"`
 | 
						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 {
 | 
					func (r *Route) UnmarshalJSON(data []byte) error {
 | 
				
			||||||
	rt := route{}
 | 
						rt := route{}
 | 
				
			||||||
	if err := json.Unmarshal(data, &rt); err != nil {
 | 
						if err := json.Unmarshal(data, &rt); err != nil {
 | 
				
			||||||
@@ -189,3 +180,6 @@ func prettyPrint(obj interface{}) error {
 | 
				
			|||||||
	_, err = os.Stdout.Write(data)
 | 
						_, err = os.Stdout.Write(data)
 | 
				
			||||||
	return err
 | 
						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