deps: update containernetworking/cni to v0.5.2
This commit is contained in:
		
							
								
								
									
										27
									
								
								Godeps/Godeps.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										27
									
								
								Godeps/Godeps.json
									
									
									
										generated
									
									
									
								
							| @@ -416,18 +416,33 @@ | ||||
| 		}, | ||||
| 		{ | ||||
| 			"ImportPath": "github.com/containernetworking/cni/libcni", | ||||
| 			"Comment": "v0.3.0-61-g9d5e6e6", | ||||
| 			"Rev": "9d5e6e60e79491207834ae8439e80c943db65a69" | ||||
| 			"Comment": "v0.5.2", | ||||
| 			"Rev": "137b4975ecab6e1f0c24c1e3c228a50a3cfba75e" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"ImportPath": "github.com/containernetworking/cni/pkg/invoke", | ||||
| 			"Comment": "v0.3.0-61-g9d5e6e6", | ||||
| 			"Rev": "9d5e6e60e79491207834ae8439e80c943db65a69" | ||||
| 			"Comment": "v0.5.2", | ||||
| 			"Rev": "137b4975ecab6e1f0c24c1e3c228a50a3cfba75e" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"ImportPath": "github.com/containernetworking/cni/pkg/types", | ||||
| 			"Comment": "v0.3.0-61-g9d5e6e6", | ||||
| 			"Rev": "9d5e6e60e79491207834ae8439e80c943db65a69" | ||||
| 			"Comment": "v0.5.2", | ||||
| 			"Rev": "137b4975ecab6e1f0c24c1e3c228a50a3cfba75e" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"ImportPath": "github.com/containernetworking/cni/pkg/types/020", | ||||
| 			"Comment": "v0.5.2", | ||||
| 			"Rev": "137b4975ecab6e1f0c24c1e3c228a50a3cfba75e" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"ImportPath": "github.com/containernetworking/cni/pkg/types/current", | ||||
| 			"Comment": "v0.5.2", | ||||
| 			"Rev": "137b4975ecab6e1f0c24c1e3c228a50a3cfba75e" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"ImportPath": "github.com/containernetworking/cni/pkg/version", | ||||
| 			"Comment": "v0.5.2", | ||||
| 			"Rev": "137b4975ecab6e1f0c24c1e3c228a50a3cfba75e" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"ImportPath": "github.com/coreos/etcd/alarm", | ||||
|   | ||||
							
								
								
									
										630
									
								
								Godeps/LICENSES
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										630
									
								
								Godeps/LICENSES
									
									
									
										generated
									
									
									
								
							| @@ -12554,6 +12554,636 @@ SOFTWARE. | ||||
| ================================================================================ | ||||
| 
 | ||||
| 
 | ||||
| ================================================================================ | ||||
| = vendor/github.com/containernetworking/cni/pkg/types/020 licensed under: = | ||||
| 
 | ||||
|                                  Apache License | ||||
|                            Version 2.0, January 2004 | ||||
|                         http://www.apache.org/licenses/ | ||||
| 
 | ||||
|    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION | ||||
| 
 | ||||
|    1. Definitions. | ||||
| 
 | ||||
|       "License" shall mean the terms and conditions for use, reproduction, | ||||
|       and distribution as defined by Sections 1 through 9 of this document. | ||||
| 
 | ||||
|       "Licensor" shall mean the copyright owner or entity authorized by | ||||
|       the copyright owner that is granting the License. | ||||
| 
 | ||||
|       "Legal Entity" shall mean the union of the acting entity and all | ||||
|       other entities that control, are controlled by, or are under common | ||||
|       control with that entity. For the purposes of this definition, | ||||
|       "control" means (i) the power, direct or indirect, to cause the | ||||
|       direction or management of such entity, whether by contract or | ||||
|       otherwise, or (ii) ownership of fifty percent (50%) or more of the | ||||
|       outstanding shares, or (iii) beneficial ownership of such entity. | ||||
| 
 | ||||
|       "You" (or "Your") shall mean an individual or Legal Entity | ||||
|       exercising permissions granted by this License. | ||||
| 
 | ||||
|       "Source" form shall mean the preferred form for making modifications, | ||||
|       including but not limited to software source code, documentation | ||||
|       source, and configuration files. | ||||
| 
 | ||||
|       "Object" form shall mean any form resulting from mechanical | ||||
|       transformation or translation of a Source form, including but | ||||
|       not limited to compiled object code, generated documentation, | ||||
|       and conversions to other media types. | ||||
| 
 | ||||
|       "Work" shall mean the work of authorship, whether in Source or | ||||
|       Object form, made available under the License, as indicated by a | ||||
|       copyright notice that is included in or attached to the work | ||||
|       (an example is provided in the Appendix below). | ||||
| 
 | ||||
|       "Derivative Works" shall mean any work, whether in Source or Object | ||||
|       form, that is based on (or derived from) the Work and for which the | ||||
|       editorial revisions, annotations, elaborations, or other modifications | ||||
|       represent, as a whole, an original work of authorship. For the purposes | ||||
|       of this License, Derivative Works shall not include works that remain | ||||
|       separable from, or merely link (or bind by name) to the interfaces of, | ||||
|       the Work and Derivative Works thereof. | ||||
| 
 | ||||
|       "Contribution" shall mean any work of authorship, including | ||||
|       the original version of the Work and any modifications or additions | ||||
|       to that Work or Derivative Works thereof, that is intentionally | ||||
|       submitted to Licensor for inclusion in the Work by the copyright owner | ||||
|       or by an individual or Legal Entity authorized to submit on behalf of | ||||
|       the copyright owner. For the purposes of this definition, "submitted" | ||||
|       means any form of electronic, verbal, or written communication sent | ||||
|       to the Licensor or its representatives, including but not limited to | ||||
|       communication on electronic mailing lists, source code control systems, | ||||
|       and issue tracking systems that are managed by, or on behalf of, the | ||||
|       Licensor for the purpose of discussing and improving the Work, but | ||||
|       excluding communication that is conspicuously marked or otherwise | ||||
|       designated in writing by the copyright owner as "Not a Contribution." | ||||
| 
 | ||||
|       "Contributor" shall mean Licensor and any individual or Legal Entity | ||||
|       on behalf of whom a Contribution has been received by Licensor and | ||||
|       subsequently incorporated within the Work. | ||||
| 
 | ||||
|    2. Grant of Copyright License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       copyright license to reproduce, prepare Derivative Works of, | ||||
|       publicly display, publicly perform, sublicense, and distribute the | ||||
|       Work and such Derivative Works in Source or Object form. | ||||
| 
 | ||||
|    3. Grant of Patent License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       (except as stated in this section) patent license to make, have made, | ||||
|       use, offer to sell, sell, import, and otherwise transfer the Work, | ||||
|       where such license applies only to those patent claims licensable | ||||
|       by such Contributor that are necessarily infringed by their | ||||
|       Contribution(s) alone or by combination of their Contribution(s) | ||||
|       with the Work to which such Contribution(s) was submitted. If You | ||||
|       institute patent litigation against any entity (including a | ||||
|       cross-claim or counterclaim in a lawsuit) alleging that the Work | ||||
|       or a Contribution incorporated within the Work constitutes direct | ||||
|       or contributory patent infringement, then any patent licenses | ||||
|       granted to You under this License for that Work shall terminate | ||||
|       as of the date such litigation is filed. | ||||
| 
 | ||||
|    4. Redistribution. You may reproduce and distribute copies of the | ||||
|       Work or Derivative Works thereof in any medium, with or without | ||||
|       modifications, and in Source or Object form, provided that You | ||||
|       meet the following conditions: | ||||
| 
 | ||||
|       (a) You must give any other recipients of the Work or | ||||
|           Derivative Works a copy of this License; and | ||||
| 
 | ||||
|       (b) You must cause any modified files to carry prominent notices | ||||
|           stating that You changed the files; and | ||||
| 
 | ||||
|       (c) You must retain, in the Source form of any Derivative Works | ||||
|           that You distribute, all copyright, patent, trademark, and | ||||
|           attribution notices from the Source form of the Work, | ||||
|           excluding those notices that do not pertain to any part of | ||||
|           the Derivative Works; and | ||||
| 
 | ||||
|       (d) If the Work includes a "NOTICE" text file as part of its | ||||
|           distribution, then any Derivative Works that You distribute must | ||||
|           include a readable copy of the attribution notices contained | ||||
|           within such NOTICE file, excluding those notices that do not | ||||
|           pertain to any part of the Derivative Works, in at least one | ||||
|           of the following places: within a NOTICE text file distributed | ||||
|           as part of the Derivative Works; within the Source form or | ||||
|           documentation, if provided along with the Derivative Works; or, | ||||
|           within a display generated by the Derivative Works, if and | ||||
|           wherever such third-party notices normally appear. The contents | ||||
|           of the NOTICE file are for informational purposes only and | ||||
|           do not modify the License. You may add Your own attribution | ||||
|           notices within Derivative Works that You distribute, alongside | ||||
|           or as an addendum to the NOTICE text from the Work, provided | ||||
|           that such additional attribution notices cannot be construed | ||||
|           as modifying the License. | ||||
| 
 | ||||
|       You may add Your own copyright statement to Your modifications and | ||||
|       may provide additional or different license terms and conditions | ||||
|       for use, reproduction, or distribution of Your modifications, or | ||||
|       for any such Derivative Works as a whole, provided Your use, | ||||
|       reproduction, and distribution of the Work otherwise complies with | ||||
|       the conditions stated in this License. | ||||
| 
 | ||||
|    5. Submission of Contributions. Unless You explicitly state otherwise, | ||||
|       any Contribution intentionally submitted for inclusion in the Work | ||||
|       by You to the Licensor shall be under the terms and conditions of | ||||
|       this License, without any additional terms or conditions. | ||||
|       Notwithstanding the above, nothing herein shall supersede or modify | ||||
|       the terms of any separate license agreement you may have executed | ||||
|       with Licensor regarding such Contributions. | ||||
| 
 | ||||
|    6. Trademarks. This License does not grant permission to use the trade | ||||
|       names, trademarks, service marks, or product names of the Licensor, | ||||
|       except as required for reasonable and customary use in describing the | ||||
|       origin of the Work and reproducing the content of the NOTICE file. | ||||
| 
 | ||||
|    7. Disclaimer of Warranty. Unless required by applicable law or | ||||
|       agreed to in writing, Licensor provides the Work (and each | ||||
|       Contributor provides its Contributions) on an "AS IS" BASIS, | ||||
|       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||
|       implied, including, without limitation, any warranties or conditions | ||||
|       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A | ||||
|       PARTICULAR PURPOSE. You are solely responsible for determining the | ||||
|       appropriateness of using or redistributing the Work and assume any | ||||
|       risks associated with Your exercise of permissions under this License. | ||||
| 
 | ||||
|    8. Limitation of Liability. In no event and under no legal theory, | ||||
|       whether in tort (including negligence), contract, or otherwise, | ||||
|       unless required by applicable law (such as deliberate and grossly | ||||
|       negligent acts) or agreed to in writing, shall any Contributor be | ||||
|       liable to You for damages, including any direct, indirect, special, | ||||
|       incidental, or consequential damages of any character arising as a | ||||
|       result of this License or out of the use or inability to use the | ||||
|       Work (including but not limited to damages for loss of goodwill, | ||||
|       work stoppage, computer failure or malfunction, or any and all | ||||
|       other commercial damages or losses), even if such Contributor | ||||
|       has been advised of the possibility of such damages. | ||||
| 
 | ||||
|    9. Accepting Warranty or Additional Liability. While redistributing | ||||
|       the Work or Derivative Works thereof, You may choose to offer, | ||||
|       and charge a fee for, acceptance of support, warranty, indemnity, | ||||
|       or other liability obligations and/or rights consistent with this | ||||
|       License. However, in accepting such obligations, You may act only | ||||
|       on Your own behalf and on Your sole responsibility, not on behalf | ||||
|       of any other Contributor, and only if You agree to indemnify, | ||||
|       defend, and hold each Contributor harmless for any liability | ||||
|       incurred by, or claims asserted against, such Contributor by reason | ||||
|       of your accepting any such warranty or additional liability. | ||||
| 
 | ||||
|    END OF TERMS AND CONDITIONS | ||||
| 
 | ||||
|    APPENDIX: How to apply the Apache License to your work. | ||||
| 
 | ||||
|       To apply the Apache License to your work, attach the following | ||||
|       boilerplate notice, with the fields enclosed by brackets "{}" | ||||
|       replaced with your own identifying information. (Don't include | ||||
|       the brackets!)  The text should be enclosed in the appropriate | ||||
|       comment syntax for the file format. We also recommend that a | ||||
|       file or class name and description of purpose be included on the | ||||
|       same "printed page" as the copyright notice for easier | ||||
|       identification within third-party archives. | ||||
| 
 | ||||
|    Copyright {yyyy} {name of copyright owner} | ||||
| 
 | ||||
|    Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|    you may not use this file except in compliance with the License. | ||||
|    You may obtain a copy of the License at | ||||
| 
 | ||||
|        http://www.apache.org/licenses/LICENSE-2.0 | ||||
| 
 | ||||
|    Unless required by applicable law or agreed to in writing, software | ||||
|    distributed under the License is distributed on an "AS IS" BASIS, | ||||
|    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|    See the License for the specific language governing permissions and | ||||
|    limitations under the License. | ||||
| 
 | ||||
| 
 | ||||
| = vendor/github.com/containernetworking/cni/LICENSE fa818a259cbed7ce8bc2a22d35a464fc  - | ||||
| ================================================================================ | ||||
| 
 | ||||
| 
 | ||||
| ================================================================================ | ||||
| = vendor/github.com/containernetworking/cni/pkg/types/current licensed under: = | ||||
| 
 | ||||
|                                  Apache License | ||||
|                            Version 2.0, January 2004 | ||||
|                         http://www.apache.org/licenses/ | ||||
| 
 | ||||
|    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION | ||||
| 
 | ||||
|    1. Definitions. | ||||
| 
 | ||||
|       "License" shall mean the terms and conditions for use, reproduction, | ||||
|       and distribution as defined by Sections 1 through 9 of this document. | ||||
| 
 | ||||
|       "Licensor" shall mean the copyright owner or entity authorized by | ||||
|       the copyright owner that is granting the License. | ||||
| 
 | ||||
|       "Legal Entity" shall mean the union of the acting entity and all | ||||
|       other entities that control, are controlled by, or are under common | ||||
|       control with that entity. For the purposes of this definition, | ||||
|       "control" means (i) the power, direct or indirect, to cause the | ||||
|       direction or management of such entity, whether by contract or | ||||
|       otherwise, or (ii) ownership of fifty percent (50%) or more of the | ||||
|       outstanding shares, or (iii) beneficial ownership of such entity. | ||||
| 
 | ||||
|       "You" (or "Your") shall mean an individual or Legal Entity | ||||
|       exercising permissions granted by this License. | ||||
| 
 | ||||
|       "Source" form shall mean the preferred form for making modifications, | ||||
|       including but not limited to software source code, documentation | ||||
|       source, and configuration files. | ||||
| 
 | ||||
|       "Object" form shall mean any form resulting from mechanical | ||||
|       transformation or translation of a Source form, including but | ||||
|       not limited to compiled object code, generated documentation, | ||||
|       and conversions to other media types. | ||||
| 
 | ||||
|       "Work" shall mean the work of authorship, whether in Source or | ||||
|       Object form, made available under the License, as indicated by a | ||||
|       copyright notice that is included in or attached to the work | ||||
|       (an example is provided in the Appendix below). | ||||
| 
 | ||||
|       "Derivative Works" shall mean any work, whether in Source or Object | ||||
|       form, that is based on (or derived from) the Work and for which the | ||||
|       editorial revisions, annotations, elaborations, or other modifications | ||||
|       represent, as a whole, an original work of authorship. For the purposes | ||||
|       of this License, Derivative Works shall not include works that remain | ||||
|       separable from, or merely link (or bind by name) to the interfaces of, | ||||
|       the Work and Derivative Works thereof. | ||||
| 
 | ||||
|       "Contribution" shall mean any work of authorship, including | ||||
|       the original version of the Work and any modifications or additions | ||||
|       to that Work or Derivative Works thereof, that is intentionally | ||||
|       submitted to Licensor for inclusion in the Work by the copyright owner | ||||
|       or by an individual or Legal Entity authorized to submit on behalf of | ||||
|       the copyright owner. For the purposes of this definition, "submitted" | ||||
|       means any form of electronic, verbal, or written communication sent | ||||
|       to the Licensor or its representatives, including but not limited to | ||||
|       communication on electronic mailing lists, source code control systems, | ||||
|       and issue tracking systems that are managed by, or on behalf of, the | ||||
|       Licensor for the purpose of discussing and improving the Work, but | ||||
|       excluding communication that is conspicuously marked or otherwise | ||||
|       designated in writing by the copyright owner as "Not a Contribution." | ||||
| 
 | ||||
|       "Contributor" shall mean Licensor and any individual or Legal Entity | ||||
|       on behalf of whom a Contribution has been received by Licensor and | ||||
|       subsequently incorporated within the Work. | ||||
| 
 | ||||
|    2. Grant of Copyright License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       copyright license to reproduce, prepare Derivative Works of, | ||||
|       publicly display, publicly perform, sublicense, and distribute the | ||||
|       Work and such Derivative Works in Source or Object form. | ||||
| 
 | ||||
|    3. Grant of Patent License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       (except as stated in this section) patent license to make, have made, | ||||
|       use, offer to sell, sell, import, and otherwise transfer the Work, | ||||
|       where such license applies only to those patent claims licensable | ||||
|       by such Contributor that are necessarily infringed by their | ||||
|       Contribution(s) alone or by combination of their Contribution(s) | ||||
|       with the Work to which such Contribution(s) was submitted. If You | ||||
|       institute patent litigation against any entity (including a | ||||
|       cross-claim or counterclaim in a lawsuit) alleging that the Work | ||||
|       or a Contribution incorporated within the Work constitutes direct | ||||
|       or contributory patent infringement, then any patent licenses | ||||
|       granted to You under this License for that Work shall terminate | ||||
|       as of the date such litigation is filed. | ||||
| 
 | ||||
|    4. Redistribution. You may reproduce and distribute copies of the | ||||
|       Work or Derivative Works thereof in any medium, with or without | ||||
|       modifications, and in Source or Object form, provided that You | ||||
|       meet the following conditions: | ||||
| 
 | ||||
|       (a) You must give any other recipients of the Work or | ||||
|           Derivative Works a copy of this License; and | ||||
| 
 | ||||
|       (b) You must cause any modified files to carry prominent notices | ||||
|           stating that You changed the files; and | ||||
| 
 | ||||
|       (c) You must retain, in the Source form of any Derivative Works | ||||
|           that You distribute, all copyright, patent, trademark, and | ||||
|           attribution notices from the Source form of the Work, | ||||
|           excluding those notices that do not pertain to any part of | ||||
|           the Derivative Works; and | ||||
| 
 | ||||
|       (d) If the Work includes a "NOTICE" text file as part of its | ||||
|           distribution, then any Derivative Works that You distribute must | ||||
|           include a readable copy of the attribution notices contained | ||||
|           within such NOTICE file, excluding those notices that do not | ||||
|           pertain to any part of the Derivative Works, in at least one | ||||
|           of the following places: within a NOTICE text file distributed | ||||
|           as part of the Derivative Works; within the Source form or | ||||
|           documentation, if provided along with the Derivative Works; or, | ||||
|           within a display generated by the Derivative Works, if and | ||||
|           wherever such third-party notices normally appear. The contents | ||||
|           of the NOTICE file are for informational purposes only and | ||||
|           do not modify the License. You may add Your own attribution | ||||
|           notices within Derivative Works that You distribute, alongside | ||||
|           or as an addendum to the NOTICE text from the Work, provided | ||||
|           that such additional attribution notices cannot be construed | ||||
|           as modifying the License. | ||||
| 
 | ||||
|       You may add Your own copyright statement to Your modifications and | ||||
|       may provide additional or different license terms and conditions | ||||
|       for use, reproduction, or distribution of Your modifications, or | ||||
|       for any such Derivative Works as a whole, provided Your use, | ||||
|       reproduction, and distribution of the Work otherwise complies with | ||||
|       the conditions stated in this License. | ||||
| 
 | ||||
|    5. Submission of Contributions. Unless You explicitly state otherwise, | ||||
|       any Contribution intentionally submitted for inclusion in the Work | ||||
|       by You to the Licensor shall be under the terms and conditions of | ||||
|       this License, without any additional terms or conditions. | ||||
|       Notwithstanding the above, nothing herein shall supersede or modify | ||||
|       the terms of any separate license agreement you may have executed | ||||
|       with Licensor regarding such Contributions. | ||||
| 
 | ||||
|    6. Trademarks. This License does not grant permission to use the trade | ||||
|       names, trademarks, service marks, or product names of the Licensor, | ||||
|       except as required for reasonable and customary use in describing the | ||||
|       origin of the Work and reproducing the content of the NOTICE file. | ||||
| 
 | ||||
|    7. Disclaimer of Warranty. Unless required by applicable law or | ||||
|       agreed to in writing, Licensor provides the Work (and each | ||||
|       Contributor provides its Contributions) on an "AS IS" BASIS, | ||||
|       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||
|       implied, including, without limitation, any warranties or conditions | ||||
|       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A | ||||
|       PARTICULAR PURPOSE. You are solely responsible for determining the | ||||
|       appropriateness of using or redistributing the Work and assume any | ||||
|       risks associated with Your exercise of permissions under this License. | ||||
| 
 | ||||
|    8. Limitation of Liability. In no event and under no legal theory, | ||||
|       whether in tort (including negligence), contract, or otherwise, | ||||
|       unless required by applicable law (such as deliberate and grossly | ||||
|       negligent acts) or agreed to in writing, shall any Contributor be | ||||
|       liable to You for damages, including any direct, indirect, special, | ||||
|       incidental, or consequential damages of any character arising as a | ||||
|       result of this License or out of the use or inability to use the | ||||
|       Work (including but not limited to damages for loss of goodwill, | ||||
|       work stoppage, computer failure or malfunction, or any and all | ||||
|       other commercial damages or losses), even if such Contributor | ||||
|       has been advised of the possibility of such damages. | ||||
| 
 | ||||
|    9. Accepting Warranty or Additional Liability. While redistributing | ||||
|       the Work or Derivative Works thereof, You may choose to offer, | ||||
|       and charge a fee for, acceptance of support, warranty, indemnity, | ||||
|       or other liability obligations and/or rights consistent with this | ||||
|       License. However, in accepting such obligations, You may act only | ||||
|       on Your own behalf and on Your sole responsibility, not on behalf | ||||
|       of any other Contributor, and only if You agree to indemnify, | ||||
|       defend, and hold each Contributor harmless for any liability | ||||
|       incurred by, or claims asserted against, such Contributor by reason | ||||
|       of your accepting any such warranty or additional liability. | ||||
| 
 | ||||
|    END OF TERMS AND CONDITIONS | ||||
| 
 | ||||
|    APPENDIX: How to apply the Apache License to your work. | ||||
| 
 | ||||
|       To apply the Apache License to your work, attach the following | ||||
|       boilerplate notice, with the fields enclosed by brackets "{}" | ||||
|       replaced with your own identifying information. (Don't include | ||||
|       the brackets!)  The text should be enclosed in the appropriate | ||||
|       comment syntax for the file format. We also recommend that a | ||||
|       file or class name and description of purpose be included on the | ||||
|       same "printed page" as the copyright notice for easier | ||||
|       identification within third-party archives. | ||||
| 
 | ||||
|    Copyright {yyyy} {name of copyright owner} | ||||
| 
 | ||||
|    Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|    you may not use this file except in compliance with the License. | ||||
|    You may obtain a copy of the License at | ||||
| 
 | ||||
|        http://www.apache.org/licenses/LICENSE-2.0 | ||||
| 
 | ||||
|    Unless required by applicable law or agreed to in writing, software | ||||
|    distributed under the License is distributed on an "AS IS" BASIS, | ||||
|    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|    See the License for the specific language governing permissions and | ||||
|    limitations under the License. | ||||
| 
 | ||||
| 
 | ||||
| = vendor/github.com/containernetworking/cni/LICENSE fa818a259cbed7ce8bc2a22d35a464fc  - | ||||
| ================================================================================ | ||||
| 
 | ||||
| 
 | ||||
| ================================================================================ | ||||
| = vendor/github.com/containernetworking/cni/pkg/version licensed under: = | ||||
| 
 | ||||
|                                  Apache License | ||||
|                            Version 2.0, January 2004 | ||||
|                         http://www.apache.org/licenses/ | ||||
| 
 | ||||
|    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION | ||||
| 
 | ||||
|    1. Definitions. | ||||
| 
 | ||||
|       "License" shall mean the terms and conditions for use, reproduction, | ||||
|       and distribution as defined by Sections 1 through 9 of this document. | ||||
| 
 | ||||
|       "Licensor" shall mean the copyright owner or entity authorized by | ||||
|       the copyright owner that is granting the License. | ||||
| 
 | ||||
|       "Legal Entity" shall mean the union of the acting entity and all | ||||
|       other entities that control, are controlled by, or are under common | ||||
|       control with that entity. For the purposes of this definition, | ||||
|       "control" means (i) the power, direct or indirect, to cause the | ||||
|       direction or management of such entity, whether by contract or | ||||
|       otherwise, or (ii) ownership of fifty percent (50%) or more of the | ||||
|       outstanding shares, or (iii) beneficial ownership of such entity. | ||||
| 
 | ||||
|       "You" (or "Your") shall mean an individual or Legal Entity | ||||
|       exercising permissions granted by this License. | ||||
| 
 | ||||
|       "Source" form shall mean the preferred form for making modifications, | ||||
|       including but not limited to software source code, documentation | ||||
|       source, and configuration files. | ||||
| 
 | ||||
|       "Object" form shall mean any form resulting from mechanical | ||||
|       transformation or translation of a Source form, including but | ||||
|       not limited to compiled object code, generated documentation, | ||||
|       and conversions to other media types. | ||||
| 
 | ||||
|       "Work" shall mean the work of authorship, whether in Source or | ||||
|       Object form, made available under the License, as indicated by a | ||||
|       copyright notice that is included in or attached to the work | ||||
|       (an example is provided in the Appendix below). | ||||
| 
 | ||||
|       "Derivative Works" shall mean any work, whether in Source or Object | ||||
|       form, that is based on (or derived from) the Work and for which the | ||||
|       editorial revisions, annotations, elaborations, or other modifications | ||||
|       represent, as a whole, an original work of authorship. For the purposes | ||||
|       of this License, Derivative Works shall not include works that remain | ||||
|       separable from, or merely link (or bind by name) to the interfaces of, | ||||
|       the Work and Derivative Works thereof. | ||||
| 
 | ||||
|       "Contribution" shall mean any work of authorship, including | ||||
|       the original version of the Work and any modifications or additions | ||||
|       to that Work or Derivative Works thereof, that is intentionally | ||||
|       submitted to Licensor for inclusion in the Work by the copyright owner | ||||
|       or by an individual or Legal Entity authorized to submit on behalf of | ||||
|       the copyright owner. For the purposes of this definition, "submitted" | ||||
|       means any form of electronic, verbal, or written communication sent | ||||
|       to the Licensor or its representatives, including but not limited to | ||||
|       communication on electronic mailing lists, source code control systems, | ||||
|       and issue tracking systems that are managed by, or on behalf of, the | ||||
|       Licensor for the purpose of discussing and improving the Work, but | ||||
|       excluding communication that is conspicuously marked or otherwise | ||||
|       designated in writing by the copyright owner as "Not a Contribution." | ||||
| 
 | ||||
|       "Contributor" shall mean Licensor and any individual or Legal Entity | ||||
|       on behalf of whom a Contribution has been received by Licensor and | ||||
|       subsequently incorporated within the Work. | ||||
| 
 | ||||
|    2. Grant of Copyright License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       copyright license to reproduce, prepare Derivative Works of, | ||||
|       publicly display, publicly perform, sublicense, and distribute the | ||||
|       Work and such Derivative Works in Source or Object form. | ||||
| 
 | ||||
|    3. Grant of Patent License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       (except as stated in this section) patent license to make, have made, | ||||
|       use, offer to sell, sell, import, and otherwise transfer the Work, | ||||
|       where such license applies only to those patent claims licensable | ||||
|       by such Contributor that are necessarily infringed by their | ||||
|       Contribution(s) alone or by combination of their Contribution(s) | ||||
|       with the Work to which such Contribution(s) was submitted. If You | ||||
|       institute patent litigation against any entity (including a | ||||
|       cross-claim or counterclaim in a lawsuit) alleging that the Work | ||||
|       or a Contribution incorporated within the Work constitutes direct | ||||
|       or contributory patent infringement, then any patent licenses | ||||
|       granted to You under this License for that Work shall terminate | ||||
|       as of the date such litigation is filed. | ||||
| 
 | ||||
|    4. Redistribution. You may reproduce and distribute copies of the | ||||
|       Work or Derivative Works thereof in any medium, with or without | ||||
|       modifications, and in Source or Object form, provided that You | ||||
|       meet the following conditions: | ||||
| 
 | ||||
|       (a) You must give any other recipients of the Work or | ||||
|           Derivative Works a copy of this License; and | ||||
| 
 | ||||
|       (b) You must cause any modified files to carry prominent notices | ||||
|           stating that You changed the files; and | ||||
| 
 | ||||
|       (c) You must retain, in the Source form of any Derivative Works | ||||
|           that You distribute, all copyright, patent, trademark, and | ||||
|           attribution notices from the Source form of the Work, | ||||
|           excluding those notices that do not pertain to any part of | ||||
|           the Derivative Works; and | ||||
| 
 | ||||
|       (d) If the Work includes a "NOTICE" text file as part of its | ||||
|           distribution, then any Derivative Works that You distribute must | ||||
|           include a readable copy of the attribution notices contained | ||||
|           within such NOTICE file, excluding those notices that do not | ||||
|           pertain to any part of the Derivative Works, in at least one | ||||
|           of the following places: within a NOTICE text file distributed | ||||
|           as part of the Derivative Works; within the Source form or | ||||
|           documentation, if provided along with the Derivative Works; or, | ||||
|           within a display generated by the Derivative Works, if and | ||||
|           wherever such third-party notices normally appear. The contents | ||||
|           of the NOTICE file are for informational purposes only and | ||||
|           do not modify the License. You may add Your own attribution | ||||
|           notices within Derivative Works that You distribute, alongside | ||||
|           or as an addendum to the NOTICE text from the Work, provided | ||||
|           that such additional attribution notices cannot be construed | ||||
|           as modifying the License. | ||||
| 
 | ||||
|       You may add Your own copyright statement to Your modifications and | ||||
|       may provide additional or different license terms and conditions | ||||
|       for use, reproduction, or distribution of Your modifications, or | ||||
|       for any such Derivative Works as a whole, provided Your use, | ||||
|       reproduction, and distribution of the Work otherwise complies with | ||||
|       the conditions stated in this License. | ||||
| 
 | ||||
|    5. Submission of Contributions. Unless You explicitly state otherwise, | ||||
|       any Contribution intentionally submitted for inclusion in the Work | ||||
|       by You to the Licensor shall be under the terms and conditions of | ||||
|       this License, without any additional terms or conditions. | ||||
|       Notwithstanding the above, nothing herein shall supersede or modify | ||||
|       the terms of any separate license agreement you may have executed | ||||
|       with Licensor regarding such Contributions. | ||||
| 
 | ||||
|    6. Trademarks. This License does not grant permission to use the trade | ||||
|       names, trademarks, service marks, or product names of the Licensor, | ||||
|       except as required for reasonable and customary use in describing the | ||||
|       origin of the Work and reproducing the content of the NOTICE file. | ||||
| 
 | ||||
|    7. Disclaimer of Warranty. Unless required by applicable law or | ||||
|       agreed to in writing, Licensor provides the Work (and each | ||||
|       Contributor provides its Contributions) on an "AS IS" BASIS, | ||||
|       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||
|       implied, including, without limitation, any warranties or conditions | ||||
|       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A | ||||
|       PARTICULAR PURPOSE. You are solely responsible for determining the | ||||
|       appropriateness of using or redistributing the Work and assume any | ||||
|       risks associated with Your exercise of permissions under this License. | ||||
| 
 | ||||
|    8. Limitation of Liability. In no event and under no legal theory, | ||||
|       whether in tort (including negligence), contract, or otherwise, | ||||
|       unless required by applicable law (such as deliberate and grossly | ||||
|       negligent acts) or agreed to in writing, shall any Contributor be | ||||
|       liable to You for damages, including any direct, indirect, special, | ||||
|       incidental, or consequential damages of any character arising as a | ||||
|       result of this License or out of the use or inability to use the | ||||
|       Work (including but not limited to damages for loss of goodwill, | ||||
|       work stoppage, computer failure or malfunction, or any and all | ||||
|       other commercial damages or losses), even if such Contributor | ||||
|       has been advised of the possibility of such damages. | ||||
| 
 | ||||
|    9. Accepting Warranty or Additional Liability. While redistributing | ||||
|       the Work or Derivative Works thereof, You may choose to offer, | ||||
|       and charge a fee for, acceptance of support, warranty, indemnity, | ||||
|       or other liability obligations and/or rights consistent with this | ||||
|       License. However, in accepting such obligations, You may act only | ||||
|       on Your own behalf and on Your sole responsibility, not on behalf | ||||
|       of any other Contributor, and only if You agree to indemnify, | ||||
|       defend, and hold each Contributor harmless for any liability | ||||
|       incurred by, or claims asserted against, such Contributor by reason | ||||
|       of your accepting any such warranty or additional liability. | ||||
| 
 | ||||
|    END OF TERMS AND CONDITIONS | ||||
| 
 | ||||
|    APPENDIX: How to apply the Apache License to your work. | ||||
| 
 | ||||
|       To apply the Apache License to your work, attach the following | ||||
|       boilerplate notice, with the fields enclosed by brackets "{}" | ||||
|       replaced with your own identifying information. (Don't include | ||||
|       the brackets!)  The text should be enclosed in the appropriate | ||||
|       comment syntax for the file format. We also recommend that a | ||||
|       file or class name and description of purpose be included on the | ||||
|       same "printed page" as the copyright notice for easier | ||||
|       identification within third-party archives. | ||||
| 
 | ||||
|    Copyright {yyyy} {name of copyright owner} | ||||
| 
 | ||||
|    Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|    you may not use this file except in compliance with the License. | ||||
|    You may obtain a copy of the License at | ||||
| 
 | ||||
|        http://www.apache.org/licenses/LICENSE-2.0 | ||||
| 
 | ||||
|    Unless required by applicable law or agreed to in writing, software | ||||
|    distributed under the License is distributed on an "AS IS" BASIS, | ||||
|    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|    See the License for the specific language governing permissions and | ||||
|    limitations under the License. | ||||
| 
 | ||||
| 
 | ||||
| = vendor/github.com/containernetworking/cni/LICENSE fa818a259cbed7ce8bc2a22d35a464fc  - | ||||
| ================================================================================ | ||||
| 
 | ||||
| 
 | ||||
| ================================================================================ | ||||
| = vendor/github.com/coreos/etcd/alarm licensed under: = | ||||
| 
 | ||||
|   | ||||
							
								
								
									
										152
									
								
								vendor/github.com/containernetworking/cni/libcni/api.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										152
									
								
								vendor/github.com/containernetworking/cni/libcni/api.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -15,10 +15,12 @@ | ||||
| package libcni | ||||
|  | ||||
| import ( | ||||
| 	"os" | ||||
| 	"strings" | ||||
|  | ||||
| 	"github.com/containernetworking/cni/pkg/invoke" | ||||
| 	"github.com/containernetworking/cni/pkg/types" | ||||
| 	"github.com/containernetworking/cni/pkg/version" | ||||
| ) | ||||
|  | ||||
| type RuntimeConf struct { | ||||
| @@ -26,6 +28,12 @@ type RuntimeConf struct { | ||||
| 	NetNS       string | ||||
| 	IfName      string | ||||
| 	Args        [][2]string | ||||
| 	// A dictionary of capability-specific data passed by the runtime | ||||
| 	// to plugins as top-level keys in the 'runtimeConfig' dictionary | ||||
| 	// of the plugin's stdin data.  libcni will ensure that only keys | ||||
| 	// in this map which match the capabilities of the plugin are passed | ||||
| 	// to the plugin | ||||
| 	CapabilityArgs map[string]interface{} | ||||
| } | ||||
|  | ||||
| type NetworkConfig struct { | ||||
| @@ -33,8 +41,18 @@ type NetworkConfig struct { | ||||
| 	Bytes   []byte | ||||
| } | ||||
|  | ||||
| type NetworkConfigList struct { | ||||
| 	Name       string | ||||
| 	CNIVersion string | ||||
| 	Plugins    []*NetworkConfig | ||||
| 	Bytes      []byte | ||||
| } | ||||
|  | ||||
| type CNI interface { | ||||
| 	AddNetwork(net *NetworkConfig, rt *RuntimeConf) (*types.Result, error) | ||||
| 	AddNetworkList(net *NetworkConfigList, rt *RuntimeConf) (types.Result, error) | ||||
| 	DelNetworkList(net *NetworkConfigList, rt *RuntimeConf) error | ||||
|  | ||||
| 	AddNetwork(net *NetworkConfig, rt *RuntimeConf) (types.Result, error) | ||||
| 	DelNetwork(net *NetworkConfig, rt *RuntimeConf) error | ||||
| } | ||||
|  | ||||
| @@ -42,24 +60,152 @@ type CNIConfig struct { | ||||
| 	Path []string | ||||
| } | ||||
|  | ||||
| func (c *CNIConfig) AddNetwork(net *NetworkConfig, rt *RuntimeConf) (*types.Result, error) { | ||||
| // CNIConfig implements the CNI interface | ||||
| var _ CNI = &CNIConfig{} | ||||
|  | ||||
| func buildOneConfig(list *NetworkConfigList, orig *NetworkConfig, prevResult types.Result, rt *RuntimeConf) (*NetworkConfig, error) { | ||||
| 	var err error | ||||
|  | ||||
| 	inject := map[string]interface{}{ | ||||
| 		"name":       list.Name, | ||||
| 		"cniVersion": list.CNIVersion, | ||||
| 	} | ||||
| 	// Add previous plugin result | ||||
| 	if prevResult != nil { | ||||
| 		inject["prevResult"] = prevResult | ||||
| 	} | ||||
|  | ||||
| 	// Ensure every config uses the same name and version | ||||
| 	orig, err = InjectConf(orig, inject) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	return injectRuntimeConfig(orig, rt) | ||||
| } | ||||
|  | ||||
| // This function takes a libcni RuntimeConf structure and injects values into | ||||
| // a "runtimeConfig" dictionary in the CNI network configuration JSON that | ||||
| // will be passed to the plugin on stdin. | ||||
| // | ||||
| // Only "capabilities arguments" passed by the runtime are currently injected. | ||||
| // These capabilities arguments are filtered through the plugin's advertised | ||||
| // capabilities from its config JSON, and any keys in the CapabilityArgs | ||||
| // matching plugin capabilities are added to the "runtimeConfig" dictionary | ||||
| // sent to the plugin via JSON on stdin.  For exmaple, if the plugin's | ||||
| // capabilities include "portMappings", and the CapabilityArgs map includes a | ||||
| // "portMappings" key, that key and its value are added to the "runtimeConfig" | ||||
| // dictionary to be passed to the plugin's stdin. | ||||
| func injectRuntimeConfig(orig *NetworkConfig, rt *RuntimeConf) (*NetworkConfig, error) { | ||||
| 	var err error | ||||
|  | ||||
| 	rc := make(map[string]interface{}) | ||||
| 	for capability, supported := range orig.Network.Capabilities { | ||||
| 		if !supported { | ||||
| 			continue | ||||
| 		} | ||||
| 		if data, ok := rt.CapabilityArgs[capability]; ok { | ||||
| 			rc[capability] = data | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if len(rc) > 0 { | ||||
| 		orig, err = InjectConf(orig, map[string]interface{}{"runtimeConfig": rc}) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return orig, nil | ||||
| } | ||||
|  | ||||
| // AddNetworkList executes a sequence of plugins with the ADD command | ||||
| func (c *CNIConfig) AddNetworkList(list *NetworkConfigList, rt *RuntimeConf) (types.Result, error) { | ||||
| 	var prevResult types.Result | ||||
| 	for _, net := range list.Plugins { | ||||
| 		pluginPath, err := invoke.FindInPath(net.Network.Type, c.Path) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
|  | ||||
| 		newConf, err := buildOneConfig(list, net, prevResult, rt) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
|  | ||||
| 		prevResult, err = invoke.ExecPluginWithResult(pluginPath, newConf.Bytes, c.args("ADD", rt)) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return prevResult, nil | ||||
| } | ||||
|  | ||||
| // DelNetworkList executes a sequence of plugins with the DEL command | ||||
| func (c *CNIConfig) DelNetworkList(list *NetworkConfigList, rt *RuntimeConf) error { | ||||
| 	for i := len(list.Plugins) - 1; i >= 0; i-- { | ||||
| 		net := list.Plugins[i] | ||||
|  | ||||
| 		pluginPath, err := invoke.FindInPath(net.Network.Type, c.Path) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|  | ||||
| 		newConf, err := buildOneConfig(list, net, nil, rt) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|  | ||||
| 		if err := invoke.ExecPluginWithoutResult(pluginPath, newConf.Bytes, c.args("DEL", rt)); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // AddNetwork executes the plugin with the ADD command | ||||
| func (c *CNIConfig) AddNetwork(net *NetworkConfig, rt *RuntimeConf) (types.Result, error) { | ||||
| 	pluginPath, err := invoke.FindInPath(net.Network.Type, c.Path) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	net, err = injectRuntimeConfig(net, rt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	return invoke.ExecPluginWithResult(pluginPath, net.Bytes, c.args("ADD", rt)) | ||||
| } | ||||
|  | ||||
| // DelNetwork executes the plugin with the DEL command | ||||
| func (c *CNIConfig) DelNetwork(net *NetworkConfig, rt *RuntimeConf) error { | ||||
| 	pluginPath, err := invoke.FindInPath(net.Network.Type, c.Path) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	net, err = injectRuntimeConfig(net, rt) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	return invoke.ExecPluginWithoutResult(pluginPath, net.Bytes, c.args("DEL", rt)) | ||||
| } | ||||
|  | ||||
| // GetVersionInfo reports which versions of the CNI spec are supported by | ||||
| // the given plugin. | ||||
| func (c *CNIConfig) GetVersionInfo(pluginType string) (version.PluginInfo, error) { | ||||
| 	pluginPath, err := invoke.FindInPath(pluginType, c.Path) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	return invoke.GetVersionInfo(pluginPath) | ||||
| } | ||||
|  | ||||
| // ===== | ||||
| func (c *CNIConfig) args(action string, rt *RuntimeConf) *invoke.Args { | ||||
| 	return &invoke.Args{ | ||||
| @@ -68,6 +214,6 @@ func (c *CNIConfig) args(action string, rt *RuntimeConf) *invoke.Args { | ||||
| 		NetNS:       rt.NetNS, | ||||
| 		PluginArgs:  rt.Args, | ||||
| 		IfName:      rt.IfName, | ||||
| 		Path:        strings.Join(c.Path, ":"), | ||||
| 		Path:        strings.Join(c.Path, string(os.PathListSeparator)), | ||||
| 	} | ||||
| } | ||||
|   | ||||
							
								
								
									
										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" | ||||
| ) | ||||
|  | ||||
| type NotFoundError struct { | ||||
| 	Dir  string | ||||
| 	Name string | ||||
| } | ||||
|  | ||||
| func (e NotFoundError) Error() string { | ||||
| 	return fmt.Sprintf(`no net configuration with name "%s" in %s`, e.Name, e.Dir) | ||||
| } | ||||
|  | ||||
| type NoConfigsFoundError struct { | ||||
| 	Dir string | ||||
| } | ||||
|  | ||||
| func (e NoConfigsFoundError) Error() string { | ||||
| 	return fmt.Sprintf(`no net configurations found in %s`, e.Dir) | ||||
| } | ||||
|  | ||||
| func ConfFromBytes(bytes []byte) (*NetworkConfig, error) { | ||||
| 	conf := &NetworkConfig{Bytes: bytes} | ||||
| 	if err := json.Unmarshal(bytes, &conf.Network); err != nil { | ||||
| @@ -39,7 +56,73 @@ func ConfFromFile(filename string) (*NetworkConfig, error) { | ||||
| 	return ConfFromBytes(bytes) | ||||
| } | ||||
|  | ||||
| func ConfFiles(dir string) ([]string, error) { | ||||
| func ConfListFromBytes(bytes []byte) (*NetworkConfigList, error) { | ||||
| 	rawList := make(map[string]interface{}) | ||||
| 	if err := json.Unmarshal(bytes, &rawList); err != nil { | ||||
| 		return nil, fmt.Errorf("error parsing configuration list: %s", err) | ||||
| 	} | ||||
|  | ||||
| 	rawName, ok := rawList["name"] | ||||
| 	if !ok { | ||||
| 		return nil, fmt.Errorf("error parsing configuration list: no name") | ||||
| 	} | ||||
| 	name, ok := rawName.(string) | ||||
| 	if !ok { | ||||
| 		return nil, fmt.Errorf("error parsing configuration list: invalid name type %T", rawName) | ||||
| 	} | ||||
|  | ||||
| 	var cniVersion string | ||||
| 	rawVersion, ok := rawList["cniVersion"] | ||||
| 	if ok { | ||||
| 		cniVersion, ok = rawVersion.(string) | ||||
| 		if !ok { | ||||
| 			return nil, fmt.Errorf("error parsing configuration list: invalid cniVersion type %T", rawVersion) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	list := &NetworkConfigList{ | ||||
| 		Name:       name, | ||||
| 		CNIVersion: cniVersion, | ||||
| 		Bytes:      bytes, | ||||
| 	} | ||||
|  | ||||
| 	var plugins []interface{} | ||||
| 	plug, ok := rawList["plugins"] | ||||
| 	if !ok { | ||||
| 		return nil, fmt.Errorf("error parsing configuration list: no 'plugins' key") | ||||
| 	} | ||||
| 	plugins, ok = plug.([]interface{}) | ||||
| 	if !ok { | ||||
| 		return nil, fmt.Errorf("error parsing configuration list: invalid 'plugins' type %T", plug) | ||||
| 	} | ||||
| 	if len(plugins) == 0 { | ||||
| 		return nil, fmt.Errorf("error parsing configuration list: no plugins in list") | ||||
| 	} | ||||
|  | ||||
| 	for i, conf := range plugins { | ||||
| 		newBytes, err := json.Marshal(conf) | ||||
| 		if err != nil { | ||||
| 			return nil, fmt.Errorf("Failed to marshal plugin config %d: %v", i, err) | ||||
| 		} | ||||
| 		netConf, err := ConfFromBytes(newBytes) | ||||
| 		if err != nil { | ||||
| 			return nil, fmt.Errorf("Failed to parse plugin config %d: %v", i, err) | ||||
| 		} | ||||
| 		list.Plugins = append(list.Plugins, netConf) | ||||
| 	} | ||||
|  | ||||
| 	return list, nil | ||||
| } | ||||
|  | ||||
| func ConfListFromFile(filename string) (*NetworkConfigList, error) { | ||||
| 	bytes, err := ioutil.ReadFile(filename) | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("error reading %s: %s", filename, err) | ||||
| 	} | ||||
| 	return ConfListFromBytes(bytes) | ||||
| } | ||||
|  | ||||
| func ConfFiles(dir string, extensions []string) ([]string, error) { | ||||
| 	// In part, adapted from rkt/networking/podenv.go#listFiles | ||||
| 	files, err := ioutil.ReadDir(dir) | ||||
| 	switch { | ||||
| @@ -55,20 +138,23 @@ func ConfFiles(dir string) ([]string, error) { | ||||
| 		if f.IsDir() { | ||||
| 			continue | ||||
| 		} | ||||
| 		if filepath.Ext(f.Name()) == ".conf" { | ||||
| 			confFiles = append(confFiles, filepath.Join(dir, f.Name())) | ||||
| 		fileExt := filepath.Ext(f.Name()) | ||||
| 		for _, ext := range extensions { | ||||
| 			if fileExt == ext { | ||||
| 				confFiles = append(confFiles, filepath.Join(dir, f.Name())) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return confFiles, nil | ||||
| } | ||||
|  | ||||
| func LoadConf(dir, name string) (*NetworkConfig, error) { | ||||
| 	files, err := ConfFiles(dir) | ||||
| 	files, err := ConfFiles(dir, []string{".conf", ".json"}) | ||||
| 	switch { | ||||
| 	case err != nil: | ||||
| 		return nil, err | ||||
| 	case len(files) == 0: | ||||
| 		return nil, fmt.Errorf("no net configurations found") | ||||
| 		return nil, NoConfigsFoundError{Dir: dir} | ||||
| 	} | ||||
| 	sort.Strings(files) | ||||
|  | ||||
| @@ -81,25 +167,59 @@ func LoadConf(dir, name string) (*NetworkConfig, error) { | ||||
| 			return conf, nil | ||||
| 		} | ||||
| 	} | ||||
| 	return nil, fmt.Errorf(`no net configuration with name "%s" in %s`, name, dir) | ||||
| 	return nil, NotFoundError{dir, name} | ||||
| } | ||||
|  | ||||
| func InjectConf(original *NetworkConfig, key string, newValue interface{}) (*NetworkConfig, error) { | ||||
| func LoadConfList(dir, name string) (*NetworkConfigList, error) { | ||||
| 	files, err := ConfFiles(dir, []string{".conflist"}) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	sort.Strings(files) | ||||
|  | ||||
| 	for _, confFile := range files { | ||||
| 		conf, err := ConfListFromFile(confFile) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 		if conf.Name == name { | ||||
| 			return conf, nil | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Try and load a network configuration file (instead of list) | ||||
| 	// from the same name, then upconvert. | ||||
| 	singleConf, err := LoadConf(dir, name) | ||||
| 	if err != nil { | ||||
| 		// A little extra logic so the error makes sense | ||||
| 		if _, ok := err.(NoConfigsFoundError); len(files) != 0 && ok { | ||||
| 			// Config lists found but no config files found | ||||
| 			return nil, NotFoundError{dir, name} | ||||
| 		} | ||||
|  | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return ConfListFromConf(singleConf) | ||||
| } | ||||
|  | ||||
| func InjectConf(original *NetworkConfig, newValues map[string]interface{}) (*NetworkConfig, error) { | ||||
| 	config := make(map[string]interface{}) | ||||
| 	err := json.Unmarshal(original.Bytes, &config) | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("unmarshal existing network bytes: %s", err) | ||||
| 	} | ||||
|  | ||||
| 	if key == "" { | ||||
| 		return nil, fmt.Errorf("key value can not be empty") | ||||
| 	} | ||||
| 	for key, value := range newValues { | ||||
| 		if key == "" { | ||||
| 			return nil, fmt.Errorf("keys cannot be empty") | ||||
| 		} | ||||
|  | ||||
| 	if newValue == nil { | ||||
| 		return nil, fmt.Errorf("newValue must be specified") | ||||
| 	} | ||||
| 		if value == nil { | ||||
| 			return nil, fmt.Errorf("key '%s' value must not be nil", key) | ||||
| 		} | ||||
|  | ||||
| 	config[key] = newValue | ||||
| 		config[key] = value | ||||
| 	} | ||||
|  | ||||
| 	newBytes, err := json.Marshal(config) | ||||
| 	if err != nil { | ||||
| @@ -108,3 +228,29 @@ func InjectConf(original *NetworkConfig, key string, newValue interface{}) (*Net | ||||
|  | ||||
| 	return ConfFromBytes(newBytes) | ||||
| } | ||||
|  | ||||
| // ConfListFromConf "upconverts" a network config in to a NetworkConfigList, | ||||
| // with the single network as the only entry in the list. | ||||
| func ConfListFromConf(original *NetworkConfig) (*NetworkConfigList, error) { | ||||
| 	// Re-deserialize the config's json, then make a raw map configlist. | ||||
| 	// This may seem a bit strange, but it's to make the Bytes fields | ||||
| 	// actually make sense. Otherwise, the generated json is littered with | ||||
| 	// golang default values. | ||||
|  | ||||
| 	rawConfig := make(map[string]interface{}) | ||||
| 	if err := json.Unmarshal(original.Bytes, &rawConfig); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	rawConfigList := map[string]interface{}{ | ||||
| 		"name":       original.Network.Name, | ||||
| 		"cniVersion": original.Network.CNIVersion, | ||||
| 		"plugins":    []interface{}{rawConfig}, | ||||
| 	} | ||||
|  | ||||
| 	b, err := json.Marshal(rawConfigList) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return ConfListFromBytes(b) | ||||
| } | ||||
|   | ||||
							
								
								
									
										3
									
								
								vendor/github.com/containernetworking/cni/pkg/invoke/args.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/containernetworking/cni/pkg/invoke/args.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -47,6 +47,9 @@ type Args struct { | ||||
| 	Path          string | ||||
| } | ||||
|  | ||||
| // Args implements the CNIArgs interface | ||||
| var _ CNIArgs = &Args{} | ||||
|  | ||||
| func (args *Args) AsEnv() []string { | ||||
| 	env := os.Environ() | ||||
| 	pluginArgsStr := args.PluginArgsStr | ||||
|   | ||||
							
								
								
									
										8
									
								
								vendor/github.com/containernetworking/cni/pkg/invoke/delegate.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								vendor/github.com/containernetworking/cni/pkg/invoke/delegate.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -17,17 +17,17 @@ package invoke | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"os" | ||||
| 	"strings" | ||||
| 	"path/filepath" | ||||
|  | ||||
| 	"github.com/containernetworking/cni/pkg/types" | ||||
| ) | ||||
|  | ||||
| func DelegateAdd(delegatePlugin string, netconf []byte) (*types.Result, error) { | ||||
| func DelegateAdd(delegatePlugin string, netconf []byte) (types.Result, error) { | ||||
| 	if os.Getenv("CNI_COMMAND") != "ADD" { | ||||
| 		return nil, fmt.Errorf("CNI_COMMAND is not ADD") | ||||
| 	} | ||||
|  | ||||
| 	paths := strings.Split(os.Getenv("CNI_PATH"), ":") | ||||
| 	paths := filepath.SplitList(os.Getenv("CNI_PATH")) | ||||
|  | ||||
| 	pluginPath, err := FindInPath(delegatePlugin, paths) | ||||
| 	if err != nil { | ||||
| @@ -42,7 +42,7 @@ func DelegateDel(delegatePlugin string, netconf []byte) error { | ||||
| 		return fmt.Errorf("CNI_COMMAND is not DEL") | ||||
| 	} | ||||
|  | ||||
| 	paths := strings.Split(os.Getenv("CNI_PATH"), ":") | ||||
| 	paths := filepath.SplitList(os.Getenv("CNI_PATH")) | ||||
|  | ||||
| 	pluginPath, err := FindInPath(delegatePlugin, paths) | ||||
| 	if err != nil { | ||||
|   | ||||
							
								
								
									
										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 | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"os" | ||||
| 	"os/exec" | ||||
|  | ||||
| 	"github.com/containernetworking/cni/pkg/types" | ||||
| 	"github.com/containernetworking/cni/pkg/version" | ||||
| ) | ||||
|  | ||||
| func pluginErr(err error, output []byte) error { | ||||
| 	if _, ok := err.(*exec.ExitError); ok { | ||||
| 		emsg := types.Error{} | ||||
| 		if perr := json.Unmarshal(output, &emsg); perr != nil { | ||||
| 			return fmt.Errorf("netplugin failed but error parsing its diagnostic message %q: %v", string(output), perr) | ||||
| 		} | ||||
| 		details := "" | ||||
| 		if emsg.Details != "" { | ||||
| 			details = fmt.Sprintf("; %v", emsg.Details) | ||||
| 		} | ||||
| 		return fmt.Errorf("%v%v", emsg.Msg, details) | ||||
| 	} | ||||
|  | ||||
| 	return err | ||||
| func ExecPluginWithResult(pluginPath string, netconf []byte, args CNIArgs) (types.Result, error) { | ||||
| 	return defaultPluginExec.WithResult(pluginPath, netconf, args) | ||||
| } | ||||
|  | ||||
| func ExecPluginWithResult(pluginPath string, netconf []byte, args CNIArgs) (*types.Result, error) { | ||||
| 	stdoutBytes, err := execPlugin(pluginPath, netconf, args) | ||||
| func ExecPluginWithoutResult(pluginPath string, netconf []byte, args CNIArgs) error { | ||||
| 	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 { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	res := &types.Result{} | ||||
| 	err = json.Unmarshal(stdoutBytes, res) | ||||
| 	return res, err | ||||
| 	// Plugin must return result in same version as specified in netconf | ||||
| 	versionDecoder := &version.ConfigDecoder{} | ||||
| 	confVersion, err := versionDecoder.Decode(netconf) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	return version.NewResult(confVersion, stdoutBytes) | ||||
| } | ||||
|  | ||||
| func ExecPluginWithoutResult(pluginPath string, netconf []byte, args CNIArgs) error { | ||||
| 	_, err := execPlugin(pluginPath, netconf, args) | ||||
| func (e *PluginExec) WithoutResult(pluginPath string, netconf []byte, args CNIArgs) error { | ||||
| 	_, err := e.RawExec.ExecPlugin(pluginPath, netconf, args.AsEnv()) | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| func execPlugin(pluginPath string, netconf []byte, args CNIArgs) ([]byte, error) { | ||||
| 	stdout := &bytes.Buffer{} | ||||
| // GetVersionInfo returns the version information available about the plugin. | ||||
| // For recent-enough plugins, it uses the information returned by the VERSION | ||||
| // command.  For older plugins which do not recognize that command, it reports | ||||
| // version 0.1.0 | ||||
| func (e *PluginExec) GetVersionInfo(pluginPath string) (version.PluginInfo, error) { | ||||
| 	args := &Args{ | ||||
| 		Command: "VERSION", | ||||
|  | ||||
| 	c := exec.Cmd{ | ||||
| 		Env:    args.AsEnv(), | ||||
| 		Path:   pluginPath, | ||||
| 		Args:   []string{pluginPath}, | ||||
| 		Stdin:  bytes.NewBuffer(netconf), | ||||
| 		Stdout: stdout, | ||||
| 		Stderr: os.Stderr, | ||||
| 		// set fake values required by plugins built against an older version of skel | ||||
| 		NetNS:  "dummy", | ||||
| 		IfName: "dummy", | ||||
| 		Path:   "dummy", | ||||
| 	} | ||||
| 	if err := c.Run(); err != nil { | ||||
| 		return nil, pluginErr(err, stdout.Bytes()) | ||||
| 	stdin := []byte(fmt.Sprintf(`{"cniVersion":%q}`, version.Current())) | ||||
| 	stdoutBytes, err := e.RawExec.ExecPlugin(pluginPath, stdin, args.AsEnv()) | ||||
| 	if err != nil { | ||||
| 		if err.Error() == "unknown CNI_COMMAND: VERSION" { | ||||
| 			return version.PluginSupports("0.1.0"), nil | ||||
| 		} | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	return stdout.Bytes(), nil | ||||
| 	return e.VersionDecoder.Decode(stdoutBytes) | ||||
| } | ||||
|   | ||||
							
								
								
									
										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") | ||||
| 	} | ||||
|  | ||||
| 	var fullpath string | ||||
| 	for _, path := range paths { | ||||
| 		full := filepath.Join(path, plugin) | ||||
| 		if fi, err := os.Stat(full); err == nil && fi.Mode().IsRegular() { | ||||
| 			fullpath = full | ||||
| 			break | ||||
| 		for _, fe := range ExecutableFileExtensions { | ||||
| 			fullpath := filepath.Join(path, plugin) + fe | ||||
| 			if fi, err := os.Stat(fullpath); err == nil && fi.Mode().IsRegular() { | ||||
| 				return fullpath, nil | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if fullpath == "" { | ||||
| 		return "", fmt.Errorf("failed to find plugin %q in path %s", plugin, paths) | ||||
| 	} | ||||
|  | ||||
| 	return fullpath, nil | ||||
| 	return "", fmt.Errorf("failed to find plugin %q in path %s", plugin, paths) | ||||
| } | ||||
|   | ||||
							
								
								
									
										20
									
								
								vendor/github.com/containernetworking/cni/pkg/invoke/os_unix.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								vendor/github.com/containernetworking/cni/pkg/invoke/os_unix.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | ||||
| // Copyright 2016 CNI authors | ||||
| // | ||||
| // Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| // you may not use this file except in compliance with the License. | ||||
| // You may obtain a copy of the License at | ||||
| // | ||||
| //     http://www.apache.org/licenses/LICENSE-2.0 | ||||
| // | ||||
| // Unless required by applicable law or agreed to in writing, software | ||||
| // distributed under the License is distributed on an "AS IS" BASIS, | ||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
|  | ||||
| // +build darwin dragonfly freebsd linux netbsd opensbd solaris | ||||
|  | ||||
| package invoke | ||||
|  | ||||
| // Valid file extensions for plugin executables. | ||||
| var ExecutableFileExtensions = []string{""} | ||||
							
								
								
									
										18
									
								
								vendor/github.com/containernetworking/cni/pkg/invoke/os_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								vendor/github.com/containernetworking/cni/pkg/invoke/os_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| // Copyright 2016 CNI authors | ||||
| // | ||||
| // Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| // you may not use this file except in compliance with the License. | ||||
| // You may obtain a copy of the License at | ||||
| // | ||||
| //     http://www.apache.org/licenses/LICENSE-2.0 | ||||
| // | ||||
| // Unless required by applicable law or agreed to in writing, software | ||||
| // distributed under the License is distributed on an "AS IS" BASIS, | ||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
|  | ||||
| package invoke | ||||
|  | ||||
| // Valid file extensions for plugin executables. | ||||
| var ExecutableFileExtensions = []string{".exe", ""} | ||||
							
								
								
									
										63
									
								
								vendor/github.com/containernetworking/cni/pkg/invoke/raw_exec.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								vendor/github.com/containernetworking/cni/pkg/invoke/raw_exec.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,63 @@ | ||||
| // Copyright 2016 CNI authors | ||||
| // | ||||
| // Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| // you may not use this file except in compliance with the License. | ||||
| // You may obtain a copy of the License at | ||||
| // | ||||
| //     http://www.apache.org/licenses/LICENSE-2.0 | ||||
| // | ||||
| // Unless required by applicable law or agreed to in writing, software | ||||
| // distributed under the License is distributed on an "AS IS" BASIS, | ||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
|  | ||||
| package invoke | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"os/exec" | ||||
|  | ||||
| 	"github.com/containernetworking/cni/pkg/types" | ||||
| ) | ||||
|  | ||||
| type RawExec struct { | ||||
| 	Stderr io.Writer | ||||
| } | ||||
|  | ||||
| func (e *RawExec) ExecPlugin(pluginPath string, stdinData []byte, environ []string) ([]byte, error) { | ||||
| 	stdout := &bytes.Buffer{} | ||||
|  | ||||
| 	c := exec.Cmd{ | ||||
| 		Env:    environ, | ||||
| 		Path:   pluginPath, | ||||
| 		Args:   []string{pluginPath}, | ||||
| 		Stdin:  bytes.NewBuffer(stdinData), | ||||
| 		Stdout: stdout, | ||||
| 		Stderr: e.Stderr, | ||||
| 	} | ||||
| 	if err := c.Run(); err != nil { | ||||
| 		return nil, pluginErr(err, stdout.Bytes()) | ||||
| 	} | ||||
|  | ||||
| 	return stdout.Bytes(), nil | ||||
| } | ||||
|  | ||||
| func pluginErr(err error, output []byte) error { | ||||
| 	if _, ok := err.(*exec.ExitError); ok { | ||||
| 		emsg := types.Error{} | ||||
| 		if perr := json.Unmarshal(output, &emsg); perr != nil { | ||||
| 			return fmt.Errorf("netplugin failed but error parsing its diagnostic message %q: %v", string(output), perr) | ||||
| 		} | ||||
| 		details := "" | ||||
| 		if emsg.Details != "" { | ||||
| 			details = fmt.Sprintf("; %v", emsg.Details) | ||||
| 		} | ||||
| 		return fmt.Errorf("%v%v", emsg.Msg, details) | ||||
| 	} | ||||
|  | ||||
| 	return err | ||||
| } | ||||
							
								
								
									
										133
									
								
								vendor/github.com/containernetworking/cni/pkg/types/020/types.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										133
									
								
								vendor/github.com/containernetworking/cni/pkg/types/020/types.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,133 @@ | ||||
| // Copyright 2016 CNI authors | ||||
| // | ||||
| // Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| // you may not use this file except in compliance with the License. | ||||
| // You may obtain a copy of the License at | ||||
| // | ||||
| //     http://www.apache.org/licenses/LICENSE-2.0 | ||||
| // | ||||
| // Unless required by applicable law or agreed to in writing, software | ||||
| // distributed under the License is distributed on an "AS IS" BASIS, | ||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
|  | ||||
| package types020 | ||||
|  | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"net" | ||||
| 	"os" | ||||
|  | ||||
| 	"github.com/containernetworking/cni/pkg/types" | ||||
| ) | ||||
|  | ||||
| const implementedSpecVersion string = "0.2.0" | ||||
|  | ||||
| var SupportedVersions = []string{"", "0.1.0", implementedSpecVersion} | ||||
|  | ||||
| // Compatibility types for CNI version 0.1.0 and 0.2.0 | ||||
|  | ||||
| func NewResult(data []byte) (types.Result, error) { | ||||
| 	result := &Result{} | ||||
| 	if err := json.Unmarshal(data, result); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return result, nil | ||||
| } | ||||
|  | ||||
| func GetResult(r types.Result) (*Result, error) { | ||||
| 	// We expect version 0.1.0/0.2.0 results | ||||
| 	result020, err := r.GetAsVersion(implementedSpecVersion) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	result, ok := result020.(*Result) | ||||
| 	if !ok { | ||||
| 		return nil, fmt.Errorf("failed to convert result") | ||||
| 	} | ||||
| 	return result, nil | ||||
| } | ||||
|  | ||||
| // Result is what gets returned from the plugin (via stdout) to the caller | ||||
| type Result struct { | ||||
| 	IP4 *IPConfig `json:"ip4,omitempty"` | ||||
| 	IP6 *IPConfig `json:"ip6,omitempty"` | ||||
| 	DNS types.DNS `json:"dns,omitempty"` | ||||
| } | ||||
|  | ||||
| func (r *Result) Version() string { | ||||
| 	return implementedSpecVersion | ||||
| } | ||||
|  | ||||
| func (r *Result) GetAsVersion(version string) (types.Result, error) { | ||||
| 	for _, supportedVersion := range SupportedVersions { | ||||
| 		if version == supportedVersion { | ||||
| 			return r, nil | ||||
| 		} | ||||
| 	} | ||||
| 	return nil, fmt.Errorf("cannot convert version %q to %s", SupportedVersions, version) | ||||
| } | ||||
|  | ||||
| func (r *Result) Print() error { | ||||
| 	data, err := json.MarshalIndent(r, "", "    ") | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	_, err = os.Stdout.Write(data) | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| // String returns a formatted string in the form of "[IP4: $1,][ IP6: $2,] DNS: $3" where | ||||
| // $1 represents the receiver's IPv4, $2 represents the receiver's IPv6 and $3 the | ||||
| // receiver's DNS. If $1 or $2 are nil, they won't be present in the returned string. | ||||
| func (r *Result) String() string { | ||||
| 	var str string | ||||
| 	if r.IP4 != nil { | ||||
| 		str = fmt.Sprintf("IP4:%+v, ", *r.IP4) | ||||
| 	} | ||||
| 	if r.IP6 != nil { | ||||
| 		str += fmt.Sprintf("IP6:%+v, ", *r.IP6) | ||||
| 	} | ||||
| 	return fmt.Sprintf("%sDNS:%+v", str, r.DNS) | ||||
| } | ||||
|  | ||||
| // IPConfig contains values necessary to configure an interface | ||||
| type IPConfig struct { | ||||
| 	IP      net.IPNet | ||||
| 	Gateway net.IP | ||||
| 	Routes  []types.Route | ||||
| } | ||||
|  | ||||
| // net.IPNet is not JSON (un)marshallable so this duality is needed | ||||
| // for our custom IPNet type | ||||
|  | ||||
| // JSON (un)marshallable types | ||||
| type ipConfig struct { | ||||
| 	IP      types.IPNet   `json:"ip"` | ||||
| 	Gateway net.IP        `json:"gateway,omitempty"` | ||||
| 	Routes  []types.Route `json:"routes,omitempty"` | ||||
| } | ||||
|  | ||||
| func (c *IPConfig) MarshalJSON() ([]byte, error) { | ||||
| 	ipc := ipConfig{ | ||||
| 		IP:      types.IPNet(c.IP), | ||||
| 		Gateway: c.Gateway, | ||||
| 		Routes:  c.Routes, | ||||
| 	} | ||||
|  | ||||
| 	return json.Marshal(ipc) | ||||
| } | ||||
|  | ||||
| func (c *IPConfig) UnmarshalJSON(data []byte) error { | ||||
| 	ipc := ipConfig{} | ||||
| 	if err := json.Unmarshal(data, &ipc); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	c.IP = net.IPNet(ipc.IP) | ||||
| 	c.Gateway = ipc.Gateway | ||||
| 	c.Routes = ipc.Routes | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										291
									
								
								vendor/github.com/containernetworking/cni/pkg/types/current/types.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										291
									
								
								vendor/github.com/containernetworking/cni/pkg/types/current/types.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,291 @@ | ||||
| // Copyright 2016 CNI authors | ||||
| // | ||||
| // Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| // you may not use this file except in compliance with the License. | ||||
| // You may obtain a copy of the License at | ||||
| // | ||||
| //     http://www.apache.org/licenses/LICENSE-2.0 | ||||
| // | ||||
| // Unless required by applicable law or agreed to in writing, software | ||||
| // distributed under the License is distributed on an "AS IS" BASIS, | ||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
|  | ||||
| package current | ||||
|  | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"net" | ||||
| 	"os" | ||||
|  | ||||
| 	"github.com/containernetworking/cni/pkg/types" | ||||
| 	"github.com/containernetworking/cni/pkg/types/020" | ||||
| ) | ||||
|  | ||||
| const implementedSpecVersion string = "0.3.1" | ||||
|  | ||||
| var SupportedVersions = []string{"0.3.0", implementedSpecVersion} | ||||
|  | ||||
| func NewResult(data []byte) (types.Result, error) { | ||||
| 	result := &Result{} | ||||
| 	if err := json.Unmarshal(data, result); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return result, nil | ||||
| } | ||||
|  | ||||
| func GetResult(r types.Result) (*Result, error) { | ||||
| 	resultCurrent, err := r.GetAsVersion(implementedSpecVersion) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	result, ok := resultCurrent.(*Result) | ||||
| 	if !ok { | ||||
| 		return nil, fmt.Errorf("failed to convert result") | ||||
| 	} | ||||
| 	return result, nil | ||||
| } | ||||
|  | ||||
| var resultConverters = []struct { | ||||
| 	versions []string | ||||
| 	convert  func(types.Result) (*Result, error) | ||||
| }{ | ||||
| 	{types020.SupportedVersions, convertFrom020}, | ||||
| 	{SupportedVersions, convertFrom030}, | ||||
| } | ||||
|  | ||||
| func convertFrom020(result types.Result) (*Result, error) { | ||||
| 	oldResult, err := types020.GetResult(result) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	newResult := &Result{ | ||||
| 		DNS:    oldResult.DNS, | ||||
| 		Routes: []*types.Route{}, | ||||
| 	} | ||||
|  | ||||
| 	if oldResult.IP4 != nil { | ||||
| 		newResult.IPs = append(newResult.IPs, &IPConfig{ | ||||
| 			Version:   "4", | ||||
| 			Interface: -1, | ||||
| 			Address:   oldResult.IP4.IP, | ||||
| 			Gateway:   oldResult.IP4.Gateway, | ||||
| 		}) | ||||
| 		for _, route := range oldResult.IP4.Routes { | ||||
| 			gw := route.GW | ||||
| 			if gw == nil { | ||||
| 				gw = oldResult.IP4.Gateway | ||||
| 			} | ||||
| 			newResult.Routes = append(newResult.Routes, &types.Route{ | ||||
| 				Dst: route.Dst, | ||||
| 				GW:  gw, | ||||
| 			}) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if oldResult.IP6 != nil { | ||||
| 		newResult.IPs = append(newResult.IPs, &IPConfig{ | ||||
| 			Version:   "6", | ||||
| 			Interface: -1, | ||||
| 			Address:   oldResult.IP6.IP, | ||||
| 			Gateway:   oldResult.IP6.Gateway, | ||||
| 		}) | ||||
| 		for _, route := range oldResult.IP6.Routes { | ||||
| 			gw := route.GW | ||||
| 			if gw == nil { | ||||
| 				gw = oldResult.IP6.Gateway | ||||
| 			} | ||||
| 			newResult.Routes = append(newResult.Routes, &types.Route{ | ||||
| 				Dst: route.Dst, | ||||
| 				GW:  gw, | ||||
| 			}) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if len(newResult.IPs) == 0 { | ||||
| 		return nil, fmt.Errorf("cannot convert: no valid IP addresses") | ||||
| 	} | ||||
|  | ||||
| 	return newResult, nil | ||||
| } | ||||
|  | ||||
| func convertFrom030(result types.Result) (*Result, error) { | ||||
| 	newResult, ok := result.(*Result) | ||||
| 	if !ok { | ||||
| 		return nil, fmt.Errorf("failed to convert result") | ||||
| 	} | ||||
| 	return newResult, nil | ||||
| } | ||||
|  | ||||
| func NewResultFromResult(result types.Result) (*Result, error) { | ||||
| 	version := result.Version() | ||||
| 	for _, converter := range resultConverters { | ||||
| 		for _, supportedVersion := range converter.versions { | ||||
| 			if version == supportedVersion { | ||||
| 				return converter.convert(result) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return nil, fmt.Errorf("unsupported CNI result22 version %q", version) | ||||
| } | ||||
|  | ||||
| // Result is what gets returned from the plugin (via stdout) to the caller | ||||
| type Result struct { | ||||
| 	Interfaces []*Interface   `json:"interfaces,omitempty"` | ||||
| 	IPs        []*IPConfig    `json:"ips,omitempty"` | ||||
| 	Routes     []*types.Route `json:"routes,omitempty"` | ||||
| 	DNS        types.DNS      `json:"dns,omitempty"` | ||||
| } | ||||
|  | ||||
| // Convert to the older 0.2.0 CNI spec Result type | ||||
| func (r *Result) convertTo020() (*types020.Result, error) { | ||||
| 	oldResult := &types020.Result{ | ||||
| 		DNS: r.DNS, | ||||
| 	} | ||||
|  | ||||
| 	for _, ip := range r.IPs { | ||||
| 		// Only convert the first IP address of each version as 0.2.0 | ||||
| 		// and earlier cannot handle multiple IP addresses | ||||
| 		if ip.Version == "4" && oldResult.IP4 == nil { | ||||
| 			oldResult.IP4 = &types020.IPConfig{ | ||||
| 				IP:      ip.Address, | ||||
| 				Gateway: ip.Gateway, | ||||
| 			} | ||||
| 		} else if ip.Version == "6" && oldResult.IP6 == nil { | ||||
| 			oldResult.IP6 = &types020.IPConfig{ | ||||
| 				IP:      ip.Address, | ||||
| 				Gateway: ip.Gateway, | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if oldResult.IP4 != nil && oldResult.IP6 != nil { | ||||
| 			break | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	for _, route := range r.Routes { | ||||
| 		is4 := route.Dst.IP.To4() != nil | ||||
| 		if is4 && oldResult.IP4 != nil { | ||||
| 			oldResult.IP4.Routes = append(oldResult.IP4.Routes, types.Route{ | ||||
| 				Dst: route.Dst, | ||||
| 				GW:  route.GW, | ||||
| 			}) | ||||
| 		} else if !is4 && oldResult.IP6 != nil { | ||||
| 			oldResult.IP6.Routes = append(oldResult.IP6.Routes, types.Route{ | ||||
| 				Dst: route.Dst, | ||||
| 				GW:  route.GW, | ||||
| 			}) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if oldResult.IP4 == nil && oldResult.IP6 == nil { | ||||
| 		return nil, fmt.Errorf("cannot convert: no valid IP addresses") | ||||
| 	} | ||||
|  | ||||
| 	return oldResult, nil | ||||
| } | ||||
|  | ||||
| func (r *Result) Version() string { | ||||
| 	return implementedSpecVersion | ||||
| } | ||||
|  | ||||
| func (r *Result) GetAsVersion(version string) (types.Result, error) { | ||||
| 	switch version { | ||||
| 	case "0.3.0", implementedSpecVersion: | ||||
| 		return r, nil | ||||
| 	case types020.SupportedVersions[0], types020.SupportedVersions[1], types020.SupportedVersions[2]: | ||||
| 		return r.convertTo020() | ||||
| 	} | ||||
| 	return nil, fmt.Errorf("cannot convert version 0.3.x to %q", version) | ||||
| } | ||||
|  | ||||
| func (r *Result) Print() error { | ||||
| 	data, err := json.MarshalIndent(r, "", "    ") | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	_, err = os.Stdout.Write(data) | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| // String returns a formatted string in the form of "[Interfaces: $1,][ IP: $2,] DNS: $3" where | ||||
| // $1 represents the receiver's Interfaces, $2 represents the receiver's IP addresses and $3 the | ||||
| // receiver's DNS. If $1 or $2 are nil, they won't be present in the returned string. | ||||
| func (r *Result) String() string { | ||||
| 	var str string | ||||
| 	if len(r.Interfaces) > 0 { | ||||
| 		str += fmt.Sprintf("Interfaces:%+v, ", r.Interfaces) | ||||
| 	} | ||||
| 	if len(r.IPs) > 0 { | ||||
| 		str += fmt.Sprintf("IP:%+v, ", r.IPs) | ||||
| 	} | ||||
| 	if len(r.Routes) > 0 { | ||||
| 		str += fmt.Sprintf("Routes:%+v, ", r.Routes) | ||||
| 	} | ||||
| 	return fmt.Sprintf("%sDNS:%+v", str, r.DNS) | ||||
| } | ||||
|  | ||||
| // Convert this old version result to the current CNI version result | ||||
| func (r *Result) Convert() (*Result, error) { | ||||
| 	return r, nil | ||||
| } | ||||
|  | ||||
| // Interface contains values about the created interfaces | ||||
| type Interface struct { | ||||
| 	Name    string `json:"name"` | ||||
| 	Mac     string `json:"mac,omitempty"` | ||||
| 	Sandbox string `json:"sandbox,omitempty"` | ||||
| } | ||||
|  | ||||
| func (i *Interface) String() string { | ||||
| 	return fmt.Sprintf("%+v", *i) | ||||
| } | ||||
|  | ||||
| // IPConfig contains values necessary to configure an IP address on an interface | ||||
| type IPConfig struct { | ||||
| 	// IP version, either "4" or "6" | ||||
| 	Version string | ||||
| 	// Index into Result structs Interfaces list | ||||
| 	Interface int | ||||
| 	Address   net.IPNet | ||||
| 	Gateway   net.IP | ||||
| } | ||||
|  | ||||
| func (i *IPConfig) String() string { | ||||
| 	return fmt.Sprintf("%+v", *i) | ||||
| } | ||||
|  | ||||
| // JSON (un)marshallable types | ||||
| type ipConfig struct { | ||||
| 	Version   string      `json:"version"` | ||||
| 	Interface int         `json:"interface,omitempty"` | ||||
| 	Address   types.IPNet `json:"address"` | ||||
| 	Gateway   net.IP      `json:"gateway,omitempty"` | ||||
| } | ||||
|  | ||||
| func (c *IPConfig) MarshalJSON() ([]byte, error) { | ||||
| 	ipc := ipConfig{ | ||||
| 		Version:   c.Version, | ||||
| 		Interface: c.Interface, | ||||
| 		Address:   types.IPNet(c.Address), | ||||
| 		Gateway:   c.Gateway, | ||||
| 	} | ||||
|  | ||||
| 	return json.Marshal(ipc) | ||||
| } | ||||
|  | ||||
| func (c *IPConfig) UnmarshalJSON(data []byte) error { | ||||
| 	ipc := ipConfig{} | ||||
| 	if err := json.Unmarshal(data, &ipc); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	c.Version = ipc.Version | ||||
| 	c.Interface = ipc.Interface | ||||
| 	c.Address = net.IPNet(ipc.Address) | ||||
| 	c.Gateway = ipc.Gateway | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										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 ( | ||||
| 	"encoding/json" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"net" | ||||
| 	"os" | ||||
| @@ -57,44 +58,50 @@ func (n *IPNet) UnmarshalJSON(data []byte) error { | ||||
|  | ||||
| // NetConf describes a network. | ||||
| type NetConf struct { | ||||
| 	Name string `json:"name,omitempty"` | ||||
| 	Type string `json:"type,omitempty"` | ||||
| 	IPAM struct { | ||||
| 	CNIVersion string `json:"cniVersion,omitempty"` | ||||
|  | ||||
| 	Name         string          `json:"name,omitempty"` | ||||
| 	Type         string          `json:"type,omitempty"` | ||||
| 	Capabilities map[string]bool `json:"capabilities,omitempty"` | ||||
| 	IPAM         struct { | ||||
| 		Type string `json:"type,omitempty"` | ||||
| 	} `json:"ipam,omitempty"` | ||||
| 	DNS DNS `json:"dns"` | ||||
| } | ||||
|  | ||||
| // Result is what gets returned from the plugin (via stdout) to the caller | ||||
| type Result struct { | ||||
| 	IP4 *IPConfig `json:"ip4,omitempty"` | ||||
| 	IP6 *IPConfig `json:"ip6,omitempty"` | ||||
| 	DNS DNS       `json:"dns,omitempty"` | ||||
| // NetConfList describes an ordered list of networks. | ||||
| type NetConfList struct { | ||||
| 	CNIVersion string `json:"cniVersion,omitempty"` | ||||
|  | ||||
| 	Name    string     `json:"name,omitempty"` | ||||
| 	Plugins []*NetConf `json:"plugins,omitempty"` | ||||
| } | ||||
|  | ||||
| func (r *Result) Print() error { | ||||
| 	return prettyPrint(r) | ||||
| type ResultFactoryFunc func([]byte) (Result, error) | ||||
|  | ||||
| // Result is an interface that provides the result of plugin execution | ||||
| type Result interface { | ||||
| 	// The highest CNI specification result verison the result supports | ||||
| 	// without having to convert | ||||
| 	Version() string | ||||
|  | ||||
| 	// Returns the result converted into the requested CNI specification | ||||
| 	// result version, or an error if conversion failed | ||||
| 	GetAsVersion(version string) (Result, error) | ||||
|  | ||||
| 	// Prints the result in JSON format to stdout | ||||
| 	Print() error | ||||
|  | ||||
| 	// Returns a JSON string representation of the result | ||||
| 	String() string | ||||
| } | ||||
|  | ||||
| // String returns a formatted string in the form of "[IP4: $1,][ IP6: $2,] DNS: $3" where | ||||
| // $1 represents the receiver's IPv4, $2 represents the receiver's IPv6 and $3 the | ||||
| // receiver's DNS. If $1 or $2 are nil, they won't be present in the returned string. | ||||
| func (r *Result) String() string { | ||||
| 	var str string | ||||
| 	if r.IP4 != nil { | ||||
| 		str = fmt.Sprintf("IP4:%+v, ", *r.IP4) | ||||
| func PrintResult(result Result, version string) error { | ||||
| 	newResult, err := result.GetAsVersion(version) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if r.IP6 != nil { | ||||
| 		str += fmt.Sprintf("IP6:%+v, ", *r.IP6) | ||||
| 	} | ||||
| 	return fmt.Sprintf("%sDNS:%+v", str, r.DNS) | ||||
| } | ||||
|  | ||||
| // IPConfig contains values necessary to configure an interface | ||||
| type IPConfig struct { | ||||
| 	IP      net.IPNet | ||||
| 	Gateway net.IP | ||||
| 	Routes  []Route | ||||
| 	return newResult.Print() | ||||
| } | ||||
|  | ||||
| // DNS contains values interesting for DNS resolvers | ||||
| @@ -110,6 +117,18 @@ type Route struct { | ||||
| 	GW  net.IP | ||||
| } | ||||
|  | ||||
| func (r *Route) String() string { | ||||
| 	return fmt.Sprintf("%+v", *r) | ||||
| } | ||||
|  | ||||
| // Well known error codes | ||||
| // see https://github.com/containernetworking/cni/blob/master/SPEC.md#well-known-error-codes | ||||
| const ( | ||||
| 	ErrUnknown                uint = iota // 0 | ||||
| 	ErrIncompatibleCNIVersion             // 1 | ||||
| 	ErrUnsupportedField                   // 2 | ||||
| ) | ||||
|  | ||||
| type Error struct { | ||||
| 	Code    uint   `json:"code"` | ||||
| 	Msg     string `json:"msg"` | ||||
| @@ -128,39 +147,11 @@ func (e *Error) Print() error { | ||||
| // for our custom IPNet type | ||||
|  | ||||
| // JSON (un)marshallable types | ||||
| type ipConfig struct { | ||||
| 	IP      IPNet   `json:"ip"` | ||||
| 	Gateway net.IP  `json:"gateway,omitempty"` | ||||
| 	Routes  []Route `json:"routes,omitempty"` | ||||
| } | ||||
|  | ||||
| type route struct { | ||||
| 	Dst IPNet  `json:"dst"` | ||||
| 	GW  net.IP `json:"gw,omitempty"` | ||||
| } | ||||
|  | ||||
| func (c *IPConfig) MarshalJSON() ([]byte, error) { | ||||
| 	ipc := ipConfig{ | ||||
| 		IP:      IPNet(c.IP), | ||||
| 		Gateway: c.Gateway, | ||||
| 		Routes:  c.Routes, | ||||
| 	} | ||||
|  | ||||
| 	return json.Marshal(ipc) | ||||
| } | ||||
|  | ||||
| func (c *IPConfig) UnmarshalJSON(data []byte) error { | ||||
| 	ipc := ipConfig{} | ||||
| 	if err := json.Unmarshal(data, &ipc); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	c.IP = net.IPNet(ipc.IP) | ||||
| 	c.Gateway = ipc.Gateway | ||||
| 	c.Routes = ipc.Routes | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (r *Route) UnmarshalJSON(data []byte) error { | ||||
| 	rt := route{} | ||||
| 	if err := json.Unmarshal(data, &rt); err != nil { | ||||
| @@ -189,3 +180,6 @@ func prettyPrint(obj interface{}) error { | ||||
| 	_, err = os.Stdout.Write(data) | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| // NotImplementedError is used to indicate that a method is not implemented for the given platform | ||||
| var NotImplementedError = errors.New("Not Implemented") | ||||
|   | ||||
							
								
								
									
										37
									
								
								vendor/github.com/containernetworking/cni/pkg/version/conf.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								vendor/github.com/containernetworking/cni/pkg/version/conf.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | ||||
| // Copyright 2016 CNI authors | ||||
| // | ||||
| // Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| // you may not use this file except in compliance with the License. | ||||
| // You may obtain a copy of the License at | ||||
| // | ||||
| //     http://www.apache.org/licenses/LICENSE-2.0 | ||||
| // | ||||
| // Unless required by applicable law or agreed to in writing, software | ||||
| // distributed under the License is distributed on an "AS IS" BASIS, | ||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
|  | ||||
| package version | ||||
|  | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| ) | ||||
|  | ||||
| // ConfigDecoder can decode the CNI version available in network config data | ||||
| type ConfigDecoder struct{} | ||||
|  | ||||
| func (*ConfigDecoder) Decode(jsonBytes []byte) (string, error) { | ||||
| 	var conf struct { | ||||
| 		CNIVersion string `json:"cniVersion"` | ||||
| 	} | ||||
| 	err := json.Unmarshal(jsonBytes, &conf) | ||||
| 	if err != nil { | ||||
| 		return "", fmt.Errorf("decoding version from network config: %s", err) | ||||
| 	} | ||||
| 	if conf.CNIVersion == "" { | ||||
| 		return "0.1.0", nil | ||||
| 	} | ||||
| 	return conf.CNIVersion, nil | ||||
| } | ||||
							
								
								
									
										81
									
								
								vendor/github.com/containernetworking/cni/pkg/version/plugin.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								vendor/github.com/containernetworking/cni/pkg/version/plugin.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | ||||
| // Copyright 2016 CNI authors | ||||
| // | ||||
| // Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| // you may not use this file except in compliance with the License. | ||||
| // You may obtain a copy of the License at | ||||
| // | ||||
| //     http://www.apache.org/licenses/LICENSE-2.0 | ||||
| // | ||||
| // Unless required by applicable law or agreed to in writing, software | ||||
| // distributed under the License is distributed on an "AS IS" BASIS, | ||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
|  | ||||
| package version | ||||
|  | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| ) | ||||
|  | ||||
| // PluginInfo reports information about CNI versioning | ||||
| type PluginInfo interface { | ||||
| 	// SupportedVersions returns one or more CNI spec versions that the plugin | ||||
| 	// supports.  If input is provided in one of these versions, then the plugin | ||||
| 	// promises to use the same CNI version in its response | ||||
| 	SupportedVersions() []string | ||||
|  | ||||
| 	// Encode writes this CNI version information as JSON to the given Writer | ||||
| 	Encode(io.Writer) error | ||||
| } | ||||
|  | ||||
| type pluginInfo struct { | ||||
| 	CNIVersion_        string   `json:"cniVersion"` | ||||
| 	SupportedVersions_ []string `json:"supportedVersions,omitempty"` | ||||
| } | ||||
|  | ||||
| // pluginInfo implements the PluginInfo interface | ||||
| var _ PluginInfo = &pluginInfo{} | ||||
|  | ||||
| func (p *pluginInfo) Encode(w io.Writer) error { | ||||
| 	return json.NewEncoder(w).Encode(p) | ||||
| } | ||||
|  | ||||
| func (p *pluginInfo) SupportedVersions() []string { | ||||
| 	return p.SupportedVersions_ | ||||
| } | ||||
|  | ||||
| // PluginSupports returns a new PluginInfo that will report the given versions | ||||
| // as supported | ||||
| func PluginSupports(supportedVersions ...string) PluginInfo { | ||||
| 	if len(supportedVersions) < 1 { | ||||
| 		panic("programmer error: you must support at least one version") | ||||
| 	} | ||||
| 	return &pluginInfo{ | ||||
| 		CNIVersion_:        Current(), | ||||
| 		SupportedVersions_: supportedVersions, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // PluginDecoder can decode the response returned by a plugin's VERSION command | ||||
| type PluginDecoder struct{} | ||||
|  | ||||
| func (*PluginDecoder) Decode(jsonBytes []byte) (PluginInfo, error) { | ||||
| 	var info pluginInfo | ||||
| 	err := json.Unmarshal(jsonBytes, &info) | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("decoding version info: %s", err) | ||||
| 	} | ||||
| 	if info.CNIVersion_ == "" { | ||||
| 		return nil, fmt.Errorf("decoding version info: missing field cniVersion") | ||||
| 	} | ||||
| 	if len(info.SupportedVersions_) == 0 { | ||||
| 		if info.CNIVersion_ == "0.2.0" { | ||||
| 			return PluginSupports("0.1.0", "0.2.0"), nil | ||||
| 		} | ||||
| 		return nil, fmt.Errorf("decoding version info: missing field supportedVersions") | ||||
| 	} | ||||
| 	return &info, nil | ||||
| } | ||||
							
								
								
									
										49
									
								
								vendor/github.com/containernetworking/cni/pkg/version/reconcile.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								vendor/github.com/containernetworking/cni/pkg/version/reconcile.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,49 @@ | ||||
| // Copyright 2016 CNI authors | ||||
| // | ||||
| // Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| // you may not use this file except in compliance with the License. | ||||
| // You may obtain a copy of the License at | ||||
| // | ||||
| //     http://www.apache.org/licenses/LICENSE-2.0 | ||||
| // | ||||
| // Unless required by applicable law or agreed to in writing, software | ||||
| // distributed under the License is distributed on an "AS IS" BASIS, | ||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
|  | ||||
| package version | ||||
|  | ||||
| import "fmt" | ||||
|  | ||||
| type ErrorIncompatible struct { | ||||
| 	Config    string | ||||
| 	Supported []string | ||||
| } | ||||
|  | ||||
| func (e *ErrorIncompatible) Details() string { | ||||
| 	return fmt.Sprintf("config is %q, plugin supports %q", e.Config, e.Supported) | ||||
| } | ||||
|  | ||||
| func (e *ErrorIncompatible) Error() string { | ||||
| 	return fmt.Sprintf("incompatible CNI versions: %s", e.Details()) | ||||
| } | ||||
|  | ||||
| type Reconciler struct{} | ||||
|  | ||||
| func (r *Reconciler) Check(configVersion string, pluginInfo PluginInfo) *ErrorIncompatible { | ||||
| 	return r.CheckRaw(configVersion, pluginInfo.SupportedVersions()) | ||||
| } | ||||
|  | ||||
| func (*Reconciler) CheckRaw(configVersion string, supportedVersions []string) *ErrorIncompatible { | ||||
| 	for _, supportedVersion := range supportedVersions { | ||||
| 		if configVersion == supportedVersion { | ||||
| 			return nil | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return &ErrorIncompatible{ | ||||
| 		Config:    configVersion, | ||||
| 		Supported: supportedVersions, | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										61
									
								
								vendor/github.com/containernetworking/cni/pkg/version/version.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								vendor/github.com/containernetworking/cni/pkg/version/version.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,61 @@ | ||||
| // Copyright 2016 CNI authors | ||||
| // | ||||
| // Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| // you may not use this file except in compliance with the License. | ||||
| // You may obtain a copy of the License at | ||||
| // | ||||
| //     http://www.apache.org/licenses/LICENSE-2.0 | ||||
| // | ||||
| // Unless required by applicable law or agreed to in writing, software | ||||
| // distributed under the License is distributed on an "AS IS" BASIS, | ||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
|  | ||||
| package version | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
|  | ||||
| 	"github.com/containernetworking/cni/pkg/types" | ||||
| 	"github.com/containernetworking/cni/pkg/types/020" | ||||
| 	"github.com/containernetworking/cni/pkg/types/current" | ||||
| ) | ||||
|  | ||||
| // Current reports the version of the CNI spec implemented by this library | ||||
| func Current() string { | ||||
| 	return "0.3.1" | ||||
| } | ||||
|  | ||||
| // Legacy PluginInfo describes a plugin that is backwards compatible with the | ||||
| // CNI spec version 0.1.0.  In particular, a runtime compiled against the 0.1.0 | ||||
| // library ought to work correctly with a plugin that reports support for | ||||
| // Legacy versions. | ||||
| // | ||||
| // Any future CNI spec versions which meet this definition should be added to | ||||
| // this list. | ||||
| var Legacy = PluginSupports("0.1.0", "0.2.0") | ||||
| var All = PluginSupports("0.1.0", "0.2.0", "0.3.0", "0.3.1") | ||||
|  | ||||
| var resultFactories = []struct { | ||||
| 	supportedVersions []string | ||||
| 	newResult         types.ResultFactoryFunc | ||||
| }{ | ||||
| 	{current.SupportedVersions, current.NewResult}, | ||||
| 	{types020.SupportedVersions, types020.NewResult}, | ||||
| } | ||||
|  | ||||
| // Finds a Result object matching the requested version (if any) and asks | ||||
| // that object to parse the plugin result, returning an error if parsing failed. | ||||
| func NewResult(version string, resultBytes []byte) (types.Result, error) { | ||||
| 	reconciler := &Reconciler{} | ||||
| 	for _, resultFactory := range resultFactories { | ||||
| 		err := reconciler.CheckRaw(version, resultFactory.supportedVersions) | ||||
| 		if err == nil { | ||||
| 			// Result supports this version | ||||
| 			return resultFactory.newResult(resultBytes) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil, fmt.Errorf("unsupported CNI result version %q", version) | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Casey Callendrello
					Casey Callendrello