@lakutata/containerd 0.0.0-stage → 3.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (301) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +409 -2
  3. package/THIRD_PARTY_NOTICES.md +310 -0
  4. package/dist/cjs/client/BuildKit.d.ts +176 -0
  5. package/dist/cjs/client/BuildKit.js +536 -0
  6. package/dist/cjs/client/BuildKitMessages.d.ts +35 -0
  7. package/dist/cjs/client/BuildKitMessages.js +123 -0
  8. package/dist/cjs/client/ContainerStore.d.ts +558 -0
  9. package/dist/cjs/client/ContainerStore.js +1384 -0
  10. package/dist/cjs/client/ContainerdClient.d.ts +244 -0
  11. package/dist/cjs/client/ContainerdClient.js +455 -0
  12. package/dist/cjs/client/DockerIgnore.d.ts +44 -0
  13. package/dist/cjs/client/DockerIgnore.js +186 -0
  14. package/dist/cjs/client/Fifo.d.ts +31 -0
  15. package/dist/cjs/client/Fifo.js +66 -0
  16. package/dist/cjs/client/ImageStore.d.ts +258 -0
  17. package/dist/cjs/client/ImageStore.js +636 -0
  18. package/dist/cjs/client/Messages.d.ts +103 -0
  19. package/dist/cjs/client/Messages.js +397 -0
  20. package/dist/cjs/client/Networks.d.ts +221 -0
  21. package/dist/cjs/client/Networks.js +630 -0
  22. package/dist/cjs/client/Platforms.d.ts +53 -0
  23. package/dist/cjs/client/Platforms.js +169 -0
  24. package/dist/cjs/client/Reference.d.ts +33 -0
  25. package/dist/cjs/client/Reference.js +70 -0
  26. package/dist/cjs/client/Registry.d.ts +145 -0
  27. package/dist/cjs/client/Registry.js +272 -0
  28. package/dist/cjs/client/Rootfs.d.ts +83 -0
  29. package/dist/cjs/client/Rootfs.js +245 -0
  30. package/dist/cjs/client/Seccomp.d.ts +36 -0
  31. package/dist/cjs/client/Seccomp.js +156 -0
  32. package/dist/cjs/client/Spec.d.ts +151 -0
  33. package/dist/cjs/client/Spec.js +227 -0
  34. package/dist/cjs/client/Volumes.d.ts +42 -0
  35. package/dist/cjs/client/Volumes.js +80 -0
  36. package/dist/cjs/containerd/Containerd.d.ts +442 -0
  37. package/dist/cjs/containerd/Containerd.js +929 -0
  38. package/dist/cjs/containerd/exceptions/ContainerdConnectionException.d.ts +9 -0
  39. package/dist/cjs/containerd/exceptions/ContainerdConnectionException.js +16 -0
  40. package/dist/cjs/containerd/exceptions/ContainerdContainerNameConflictException.d.ts +8 -0
  41. package/dist/cjs/containerd/exceptions/ContainerdContainerNameConflictException.js +15 -0
  42. package/dist/cjs/containerd/exceptions/ContainerdContainerNotFoundException.d.ts +9 -0
  43. package/dist/cjs/containerd/exceptions/ContainerdContainerNotFoundException.js +16 -0
  44. package/dist/cjs/containerd/exceptions/ContainerdContainerStateException.d.ts +10 -0
  45. package/dist/cjs/containerd/exceptions/ContainerdContainerStateException.js +17 -0
  46. package/dist/cjs/containerd/exceptions/ContainerdImageBuildException.d.ts +9 -0
  47. package/dist/cjs/containerd/exceptions/ContainerdImageBuildException.js +16 -0
  48. package/dist/cjs/containerd/exceptions/ContainerdImageExportException.d.ts +9 -0
  49. package/dist/cjs/containerd/exceptions/ContainerdImageExportException.js +16 -0
  50. package/dist/cjs/containerd/exceptions/ContainerdImageImportException.d.ts +9 -0
  51. package/dist/cjs/containerd/exceptions/ContainerdImageImportException.js +16 -0
  52. package/dist/cjs/containerd/exceptions/ContainerdImageNotFoundException.d.ts +9 -0
  53. package/dist/cjs/containerd/exceptions/ContainerdImageNotFoundException.js +16 -0
  54. package/dist/cjs/containerd/exceptions/ContainerdImagePullException.d.ts +9 -0
  55. package/dist/cjs/containerd/exceptions/ContainerdImagePullException.js +16 -0
  56. package/dist/cjs/containerd/exceptions/ContainerdImagePushException.d.ts +8 -0
  57. package/dist/cjs/containerd/exceptions/ContainerdImagePushException.js +15 -0
  58. package/dist/cjs/containerd/exceptions/ContainerdNetworkConflictException.d.ts +9 -0
  59. package/dist/cjs/containerd/exceptions/ContainerdNetworkConflictException.js +16 -0
  60. package/dist/cjs/containerd/exceptions/ContainerdNetworkNotFoundException.d.ts +9 -0
  61. package/dist/cjs/containerd/exceptions/ContainerdNetworkNotFoundException.js +16 -0
  62. package/dist/cjs/containerd/exceptions/ContainerdPathNotFoundException.d.ts +8 -0
  63. package/dist/cjs/containerd/exceptions/ContainerdPathNotFoundException.js +15 -0
  64. package/dist/cjs/containerd/exceptions/ContainerdPlatformException.d.ts +9 -0
  65. package/dist/cjs/containerd/exceptions/ContainerdPlatformException.js +16 -0
  66. package/dist/cjs/containerd/exceptions/ContainerdVolumeInUseException.d.ts +8 -0
  67. package/dist/cjs/containerd/exceptions/ContainerdVolumeInUseException.js +15 -0
  68. package/dist/cjs/containerd/exceptions/ContainerdVolumeNotFoundException.d.ts +8 -0
  69. package/dist/cjs/containerd/exceptions/ContainerdVolumeNotFoundException.js +15 -0
  70. package/dist/cjs/containerd/lib/ContainerdContainer.d.ts +292 -0
  71. package/dist/cjs/containerd/lib/ContainerdContainer.js +536 -0
  72. package/dist/cjs/containerd/lib/ContainerdContainerTTY.d.ts +116 -0
  73. package/dist/cjs/containerd/lib/ContainerdContainerTTY.js +178 -0
  74. package/dist/cjs/containerd/lib/ContainerdErrors.d.ts +6 -0
  75. package/dist/cjs/containerd/lib/ContainerdErrors.js +37 -0
  76. package/dist/cjs/containerd/lib/ContainerdImage.d.ts +149 -0
  77. package/dist/cjs/containerd/lib/ContainerdImage.js +222 -0
  78. package/dist/cjs/containerd/options/ContainerdPruneOptions.d.ts +44 -0
  79. package/dist/cjs/containerd/options/ContainerdPruneOptions.js +51 -0
  80. package/dist/cjs/containerd/options/ContainerdRegistryAuthOptions.d.ts +32 -0
  81. package/dist/cjs/containerd/options/ContainerdRegistryAuthOptions.js +45 -0
  82. package/dist/cjs/containerd/options/container/ContainerCommitOptions.d.ts +57 -0
  83. package/dist/cjs/containerd/options/container/ContainerCommitOptions.js +66 -0
  84. package/dist/cjs/containerd/options/container/ContainerCreateOptions.d.ts +273 -0
  85. package/dist/cjs/containerd/options/container/ContainerCreateOptions.js +239 -0
  86. package/dist/cjs/containerd/options/container/ContainerExecOptions.d.ts +53 -0
  87. package/dist/cjs/containerd/options/container/ContainerExecOptions.js +63 -0
  88. package/dist/cjs/containerd/options/container/ContainerExportDirectoryOptions.d.ts +32 -0
  89. package/dist/cjs/containerd/options/container/ContainerExportDirectoryOptions.js +45 -0
  90. package/dist/cjs/containerd/options/container/ContainerKillOptions.d.ts +30 -0
  91. package/dist/cjs/containerd/options/container/ContainerKillOptions.js +41 -0
  92. package/dist/cjs/containerd/options/container/ContainerLogsOptions.d.ts +34 -0
  93. package/dist/cjs/containerd/options/container/ContainerLogsOptions.js +44 -0
  94. package/dist/cjs/containerd/options/container/ContainerRemoveOptions.d.ts +22 -0
  95. package/dist/cjs/containerd/options/container/ContainerRemoveOptions.js +34 -0
  96. package/dist/cjs/containerd/options/container/ContainerResourceOptions.d.ts +63 -0
  97. package/dist/cjs/containerd/options/container/ContainerResourceOptions.js +67 -0
  98. package/dist/cjs/containerd/options/container/ContainerStopOptions.d.ts +30 -0
  99. package/dist/cjs/containerd/options/container/ContainerStopOptions.js +41 -0
  100. package/dist/cjs/containerd/options/container/ContainerTTYConsoleSizeOptions.d.ts +26 -0
  101. package/dist/cjs/containerd/options/container/ContainerTTYConsoleSizeOptions.js +40 -0
  102. package/dist/cjs/containerd/options/container/ContainerTTYOptions.d.ts +50 -0
  103. package/dist/cjs/containerd/options/container/ContainerTTYOptions.js +63 -0
  104. package/dist/cjs/containerd/options/image/ImageBuildOptions.d.ts +88 -0
  105. package/dist/cjs/containerd/options/image/ImageBuildOptions.js +95 -0
  106. package/dist/cjs/containerd/options/image/ImageExportOptions.d.ts +25 -0
  107. package/dist/cjs/containerd/options/image/ImageExportOptions.js +39 -0
  108. package/dist/cjs/containerd/options/image/ImageImportOptions.d.ts +38 -0
  109. package/dist/cjs/containerd/options/image/ImageImportOptions.js +47 -0
  110. package/dist/cjs/containerd/options/image/ImagePullOptions.d.ts +53 -0
  111. package/dist/cjs/containerd/options/image/ImagePullOptions.js +66 -0
  112. package/dist/cjs/containerd/options/image/ImagePushOptions.d.ts +44 -0
  113. package/dist/cjs/containerd/options/image/ImagePushOptions.js +58 -0
  114. package/dist/cjs/containerd/options/network/NetworkCreateOptions.d.ts +82 -0
  115. package/dist/cjs/containerd/options/network/NetworkCreateOptions.js +83 -0
  116. package/dist/cjs/containerd/options/volume/VolumeCreateOptions.d.ts +26 -0
  117. package/dist/cjs/containerd/options/volume/VolumeCreateOptions.js +40 -0
  118. package/dist/cjs/containerd/types/ContainerdBind.d.ts +28 -0
  119. package/dist/cjs/containerd/types/ContainerdBind.js +2 -0
  120. package/dist/cjs/containerd/types/ContainerdBuildOutputCallback.d.ts +6 -0
  121. package/dist/cjs/containerd/types/ContainerdBuildOutputCallback.js +2 -0
  122. package/dist/cjs/containerd/types/ContainerdContainerNetwork.d.ts +40 -0
  123. package/dist/cjs/containerd/types/ContainerdContainerNetwork.js +2 -0
  124. package/dist/cjs/containerd/types/ContainerdContainerPort.d.ts +22 -0
  125. package/dist/cjs/containerd/types/ContainerdContainerPort.js +2 -0
  126. package/dist/cjs/containerd/types/ContainerdContainerState.d.ts +42 -0
  127. package/dist/cjs/containerd/types/ContainerdContainerState.js +2 -0
  128. package/dist/cjs/containerd/types/ContainerdContainerStats.d.ts +107 -0
  129. package/dist/cjs/containerd/types/ContainerdContainerStats.js +2 -0
  130. package/dist/cjs/containerd/types/ContainerdDevice.d.ts +25 -0
  131. package/dist/cjs/containerd/types/ContainerdDevice.js +2 -0
  132. package/dist/cjs/containerd/types/ContainerdExecResult.d.ts +18 -0
  133. package/dist/cjs/containerd/types/ContainerdExecResult.js +2 -0
  134. package/dist/cjs/containerd/types/ContainerdImageConfig.d.ts +46 -0
  135. package/dist/cjs/containerd/types/ContainerdImageConfig.js +2 -0
  136. package/dist/cjs/containerd/types/ContainerdNetworkInfo.d.ts +49 -0
  137. package/dist/cjs/containerd/types/ContainerdNetworkInfo.js +2 -0
  138. package/dist/cjs/containerd/types/ContainerdProgressCallback.d.ts +29 -0
  139. package/dist/cjs/containerd/types/ContainerdProgressCallback.js +2 -0
  140. package/dist/cjs/containerd/types/ContainerdPruneResult.d.ts +21 -0
  141. package/dist/cjs/containerd/types/ContainerdPruneResult.js +2 -0
  142. package/dist/cjs/containerd/types/ContainerdRestartPolicy.d.ts +13 -0
  143. package/dist/cjs/containerd/types/ContainerdRestartPolicy.js +2 -0
  144. package/dist/cjs/containerd/types/ContainerdTmpfs.d.ts +20 -0
  145. package/dist/cjs/containerd/types/ContainerdTmpfs.js +2 -0
  146. package/dist/cjs/containerd/types/ContainerdVolume.d.ts +19 -0
  147. package/dist/cjs/containerd/types/ContainerdVolume.js +2 -0
  148. package/dist/cjs/containerd/types/ContainerdVolumeInfo.d.ts +26 -0
  149. package/dist/cjs/containerd/types/ContainerdVolumeInfo.js +2 -0
  150. package/dist/cjs/exports/Containerd.d.ts +69 -0
  151. package/dist/cjs/exports/Containerd.js +87 -0
  152. package/dist/cjs/package.json +1 -0
  153. package/dist/esm/client/BuildKit.js +488 -0
  154. package/dist/esm/client/BuildKitMessages.js +120 -0
  155. package/dist/esm/client/ContainerStore.js +1339 -0
  156. package/dist/esm/client/ContainerdClient.js +416 -0
  157. package/dist/esm/client/DockerIgnore.js +179 -0
  158. package/dist/esm/client/Fifo.js +59 -0
  159. package/dist/esm/client/ImageStore.js +628 -0
  160. package/dist/esm/client/Messages.js +393 -0
  161. package/dist/esm/client/Networks.js +621 -0
  162. package/dist/esm/client/Platforms.js +156 -0
  163. package/dist/esm/client/Reference.js +66 -0
  164. package/dist/esm/client/Registry.js +263 -0
  165. package/dist/esm/client/Rootfs.js +234 -0
  166. package/dist/esm/client/Seccomp.js +152 -0
  167. package/dist/esm/client/Spec.js +220 -0
  168. package/dist/esm/client/Volumes.js +73 -0
  169. package/dist/esm/containerd/Containerd.js +923 -0
  170. package/dist/esm/containerd/exceptions/ContainerdConnectionException.js +12 -0
  171. package/dist/esm/containerd/exceptions/ContainerdContainerNameConflictException.js +11 -0
  172. package/dist/esm/containerd/exceptions/ContainerdContainerNotFoundException.js +12 -0
  173. package/dist/esm/containerd/exceptions/ContainerdContainerStateException.js +13 -0
  174. package/dist/esm/containerd/exceptions/ContainerdImageBuildException.js +12 -0
  175. package/dist/esm/containerd/exceptions/ContainerdImageExportException.js +12 -0
  176. package/dist/esm/containerd/exceptions/ContainerdImageImportException.js +12 -0
  177. package/dist/esm/containerd/exceptions/ContainerdImageNotFoundException.js +12 -0
  178. package/dist/esm/containerd/exceptions/ContainerdImagePullException.js +12 -0
  179. package/dist/esm/containerd/exceptions/ContainerdImagePushException.js +11 -0
  180. package/dist/esm/containerd/exceptions/ContainerdNetworkConflictException.js +12 -0
  181. package/dist/esm/containerd/exceptions/ContainerdNetworkNotFoundException.js +12 -0
  182. package/dist/esm/containerd/exceptions/ContainerdPathNotFoundException.js +11 -0
  183. package/dist/esm/containerd/exceptions/ContainerdPlatformException.js +12 -0
  184. package/dist/esm/containerd/exceptions/ContainerdVolumeInUseException.js +11 -0
  185. package/dist/esm/containerd/exceptions/ContainerdVolumeNotFoundException.js +11 -0
  186. package/dist/esm/containerd/lib/ContainerdContainer.js +533 -0
  187. package/dist/esm/containerd/lib/ContainerdContainerTTY.js +175 -0
  188. package/dist/esm/containerd/lib/ContainerdErrors.js +34 -0
  189. package/dist/esm/containerd/lib/ContainerdImage.js +219 -0
  190. package/dist/esm/containerd/options/ContainerdPruneOptions.js +47 -0
  191. package/dist/esm/containerd/options/ContainerdRegistryAuthOptions.js +41 -0
  192. package/dist/esm/containerd/options/container/ContainerCommitOptions.js +62 -0
  193. package/dist/esm/containerd/options/container/ContainerCreateOptions.js +235 -0
  194. package/dist/esm/containerd/options/container/ContainerExecOptions.js +59 -0
  195. package/dist/esm/containerd/options/container/ContainerExportDirectoryOptions.js +41 -0
  196. package/dist/esm/containerd/options/container/ContainerKillOptions.js +37 -0
  197. package/dist/esm/containerd/options/container/ContainerLogsOptions.js +40 -0
  198. package/dist/esm/containerd/options/container/ContainerRemoveOptions.js +30 -0
  199. package/dist/esm/containerd/options/container/ContainerResourceOptions.js +63 -0
  200. package/dist/esm/containerd/options/container/ContainerStopOptions.js +37 -0
  201. package/dist/esm/containerd/options/container/ContainerTTYConsoleSizeOptions.js +36 -0
  202. package/dist/esm/containerd/options/container/ContainerTTYOptions.js +59 -0
  203. package/dist/esm/containerd/options/image/ImageBuildOptions.js +91 -0
  204. package/dist/esm/containerd/options/image/ImageExportOptions.js +35 -0
  205. package/dist/esm/containerd/options/image/ImageImportOptions.js +43 -0
  206. package/dist/esm/containerd/options/image/ImagePullOptions.js +62 -0
  207. package/dist/esm/containerd/options/image/ImagePushOptions.js +54 -0
  208. package/dist/esm/containerd/options/network/NetworkCreateOptions.js +79 -0
  209. package/dist/esm/containerd/options/volume/VolumeCreateOptions.js +36 -0
  210. package/dist/esm/containerd/types/ContainerdBind.js +1 -0
  211. package/dist/esm/containerd/types/ContainerdBuildOutputCallback.js +1 -0
  212. package/dist/esm/containerd/types/ContainerdContainerNetwork.js +1 -0
  213. package/dist/esm/containerd/types/ContainerdContainerPort.js +1 -0
  214. package/dist/esm/containerd/types/ContainerdContainerState.js +1 -0
  215. package/dist/esm/containerd/types/ContainerdContainerStats.js +1 -0
  216. package/dist/esm/containerd/types/ContainerdDevice.js +1 -0
  217. package/dist/esm/containerd/types/ContainerdExecResult.js +1 -0
  218. package/dist/esm/containerd/types/ContainerdImageConfig.js +1 -0
  219. package/dist/esm/containerd/types/ContainerdNetworkInfo.js +1 -0
  220. package/dist/esm/containerd/types/ContainerdProgressCallback.js +1 -0
  221. package/dist/esm/containerd/types/ContainerdPruneResult.js +1 -0
  222. package/dist/esm/containerd/types/ContainerdRestartPolicy.js +1 -0
  223. package/dist/esm/containerd/types/ContainerdTmpfs.js +1 -0
  224. package/dist/esm/containerd/types/ContainerdVolume.js +1 -0
  225. package/dist/esm/containerd/types/ContainerdVolumeInfo.js +1 -0
  226. package/dist/esm/exports/Containerd.js +68 -0
  227. package/dist/types/client/BuildKit.d.ts +176 -0
  228. package/dist/types/client/BuildKitMessages.d.ts +35 -0
  229. package/dist/types/client/ContainerStore.d.ts +558 -0
  230. package/dist/types/client/ContainerdClient.d.ts +244 -0
  231. package/dist/types/client/DockerIgnore.d.ts +44 -0
  232. package/dist/types/client/Fifo.d.ts +31 -0
  233. package/dist/types/client/ImageStore.d.ts +258 -0
  234. package/dist/types/client/Messages.d.ts +103 -0
  235. package/dist/types/client/Networks.d.ts +221 -0
  236. package/dist/types/client/Platforms.d.ts +53 -0
  237. package/dist/types/client/Reference.d.ts +33 -0
  238. package/dist/types/client/Registry.d.ts +145 -0
  239. package/dist/types/client/Rootfs.d.ts +83 -0
  240. package/dist/types/client/Seccomp.d.ts +36 -0
  241. package/dist/types/client/Spec.d.ts +151 -0
  242. package/dist/types/client/Volumes.d.ts +42 -0
  243. package/dist/types/containerd/Containerd.d.ts +442 -0
  244. package/dist/types/containerd/exceptions/ContainerdConnectionException.d.ts +9 -0
  245. package/dist/types/containerd/exceptions/ContainerdContainerNameConflictException.d.ts +8 -0
  246. package/dist/types/containerd/exceptions/ContainerdContainerNotFoundException.d.ts +9 -0
  247. package/dist/types/containerd/exceptions/ContainerdContainerStateException.d.ts +10 -0
  248. package/dist/types/containerd/exceptions/ContainerdImageBuildException.d.ts +9 -0
  249. package/dist/types/containerd/exceptions/ContainerdImageExportException.d.ts +9 -0
  250. package/dist/types/containerd/exceptions/ContainerdImageImportException.d.ts +9 -0
  251. package/dist/types/containerd/exceptions/ContainerdImageNotFoundException.d.ts +9 -0
  252. package/dist/types/containerd/exceptions/ContainerdImagePullException.d.ts +9 -0
  253. package/dist/types/containerd/exceptions/ContainerdImagePushException.d.ts +8 -0
  254. package/dist/types/containerd/exceptions/ContainerdNetworkConflictException.d.ts +9 -0
  255. package/dist/types/containerd/exceptions/ContainerdNetworkNotFoundException.d.ts +9 -0
  256. package/dist/types/containerd/exceptions/ContainerdPathNotFoundException.d.ts +8 -0
  257. package/dist/types/containerd/exceptions/ContainerdPlatformException.d.ts +9 -0
  258. package/dist/types/containerd/exceptions/ContainerdVolumeInUseException.d.ts +8 -0
  259. package/dist/types/containerd/exceptions/ContainerdVolumeNotFoundException.d.ts +8 -0
  260. package/dist/types/containerd/lib/ContainerdContainer.d.ts +292 -0
  261. package/dist/types/containerd/lib/ContainerdContainerTTY.d.ts +116 -0
  262. package/dist/types/containerd/lib/ContainerdErrors.d.ts +6 -0
  263. package/dist/types/containerd/lib/ContainerdImage.d.ts +149 -0
  264. package/dist/types/containerd/options/ContainerdPruneOptions.d.ts +44 -0
  265. package/dist/types/containerd/options/ContainerdRegistryAuthOptions.d.ts +32 -0
  266. package/dist/types/containerd/options/container/ContainerCommitOptions.d.ts +57 -0
  267. package/dist/types/containerd/options/container/ContainerCreateOptions.d.ts +273 -0
  268. package/dist/types/containerd/options/container/ContainerExecOptions.d.ts +53 -0
  269. package/dist/types/containerd/options/container/ContainerExportDirectoryOptions.d.ts +32 -0
  270. package/dist/types/containerd/options/container/ContainerKillOptions.d.ts +30 -0
  271. package/dist/types/containerd/options/container/ContainerLogsOptions.d.ts +34 -0
  272. package/dist/types/containerd/options/container/ContainerRemoveOptions.d.ts +22 -0
  273. package/dist/types/containerd/options/container/ContainerResourceOptions.d.ts +63 -0
  274. package/dist/types/containerd/options/container/ContainerStopOptions.d.ts +30 -0
  275. package/dist/types/containerd/options/container/ContainerTTYConsoleSizeOptions.d.ts +26 -0
  276. package/dist/types/containerd/options/container/ContainerTTYOptions.d.ts +50 -0
  277. package/dist/types/containerd/options/image/ImageBuildOptions.d.ts +88 -0
  278. package/dist/types/containerd/options/image/ImageExportOptions.d.ts +25 -0
  279. package/dist/types/containerd/options/image/ImageImportOptions.d.ts +38 -0
  280. package/dist/types/containerd/options/image/ImagePullOptions.d.ts +53 -0
  281. package/dist/types/containerd/options/image/ImagePushOptions.d.ts +44 -0
  282. package/dist/types/containerd/options/network/NetworkCreateOptions.d.ts +82 -0
  283. package/dist/types/containerd/options/volume/VolumeCreateOptions.d.ts +26 -0
  284. package/dist/types/containerd/types/ContainerdBind.d.ts +28 -0
  285. package/dist/types/containerd/types/ContainerdBuildOutputCallback.d.ts +6 -0
  286. package/dist/types/containerd/types/ContainerdContainerNetwork.d.ts +40 -0
  287. package/dist/types/containerd/types/ContainerdContainerPort.d.ts +22 -0
  288. package/dist/types/containerd/types/ContainerdContainerState.d.ts +42 -0
  289. package/dist/types/containerd/types/ContainerdContainerStats.d.ts +107 -0
  290. package/dist/types/containerd/types/ContainerdDevice.d.ts +25 -0
  291. package/dist/types/containerd/types/ContainerdExecResult.d.ts +18 -0
  292. package/dist/types/containerd/types/ContainerdImageConfig.d.ts +46 -0
  293. package/dist/types/containerd/types/ContainerdNetworkInfo.d.ts +49 -0
  294. package/dist/types/containerd/types/ContainerdProgressCallback.d.ts +29 -0
  295. package/dist/types/containerd/types/ContainerdPruneResult.d.ts +21 -0
  296. package/dist/types/containerd/types/ContainerdRestartPolicy.d.ts +13 -0
  297. package/dist/types/containerd/types/ContainerdTmpfs.d.ts +20 -0
  298. package/dist/types/containerd/types/ContainerdVolume.d.ts +19 -0
  299. package/dist/types/containerd/types/ContainerdVolumeInfo.d.ts +26 -0
  300. package/dist/types/exports/Containerd.d.ts +69 -0
  301. package/package.json +51 -4
@@ -0,0 +1,621 @@
1
+ import { createHash, randomBytes } from 'node:crypto';
2
+ import { spawn, spawnSync } from 'node:child_process';
3
+ import { accessSync, constants as fsConstants, existsSync } from 'node:fs';
4
+ import { mkdir, readdir, readFile, rm, writeFile } from 'node:fs/promises';
5
+ import { isIPv6 } from 'node:net';
6
+ import path from 'node:path';
7
+ /**
8
+ * The default network of nerdctl
9
+ */
10
+ export const DEFAULT_NETWORK = 'bridge';
11
+ const DEFAULT_SUBNET = '10.4.0.0/24';
12
+ const DEFAULT_BRIDGE = 'nerdctl0';
13
+ /**
14
+ * The directory of the leases of the addresses of the networks created (in /run: released at the boots, when the
15
+ * containers of the last one did not stop)
16
+ */
17
+ const IPAM_DATA_DIR = '/run/lakutata/cni/ipam';
18
+ /**
19
+ * The script of the networks of the containers, run by runc as their hooks: add (createRuntime, the networks of CNI
20
+ * added to the namespace of the container, its /etc/hosts given its address), del (poststop, the networks deleted, their
21
+ * addresses released). The plugins of each network are chained as libcni chains them (the result of each one is the
22
+ * previous result of the next one); their configurations are the files written for the container
23
+ */
24
+ export const HOOK_SCRIPT = `#!/bin/sh
25
+ # The networks of a container (CNI), run by runc: add (createRuntime), del (poststop); the state of the container on the
26
+ # standard input
27
+ command="$1"
28
+ dir="$2"
29
+ state=$(cat)
30
+ . "$dir/network/env"
31
+ pid=$(printf '%s' "$state" | tr -d '\\n' | sed -n 's/.*"pid": *\\([0-9][0-9]*\\).*/\\1/p')
32
+ # The namespace of the network of the container, kept by a bind mount until its networks are deleted (the plugins delete
33
+ # their rules from the namespace, gone with the container otherwise)
34
+ netns="$dir/network/netns"
35
+
36
+ mounted() {
37
+ awk -v target="$netns" '$5 == target { found = 1 } END { exit !found }' /proc/self/mountinfo
38
+ }
39
+
40
+ plugin() {
41
+ old_ifs=$IFS
42
+ IFS=:
43
+ for directory in $CNI_PATH; do
44
+ if [ -x "$directory/$1" ]; then
45
+ IFS=$old_ifs
46
+ printf '%s' "$directory/$1"
47
+ return 0
48
+ fi
49
+ done
50
+ IFS=$old_ifs
51
+ return 1
52
+ }
53
+
54
+ # The input of a plugin: its configuration, the previous result
55
+ input() {
56
+ if [ -n "$2" ]; then printf '%s,"prevResult":%s}' "$(cat "$1")" "$2"; else printf '%s}' "$(cat "$1")"; fi
57
+ }
58
+
59
+ add() {
60
+ net="$1"
61
+ export CNI_COMMAND=ADD CNI_CONTAINERID CNI_NETNS="$netns" CNI_IFNAME="$(cat "$net/ifname")" CNI_ARGS="$(cat "$net/args")" CNI_PATH
62
+ count=$(cat "$net/count")
63
+ previous=""
64
+ i=1
65
+ while [ "$i" -le "$count" ]; do
66
+ type=$(cat "$net/$i.type")
67
+ binary=$(plugin "$type") || { echo "the CNI plugin $type is not in $CNI_PATH" >&2; return 1; }
68
+ if ! previous=$(input "$net/$i.conf" "$previous" | "$binary"); then
69
+ echo "the CNI plugin $type of the network $(cat "$net/name") failed: $previous" >&2
70
+ return 1
71
+ fi
72
+ i=$((i + 1))
73
+ done
74
+ printf '%s' "$previous" > "$net/result.json"
75
+ }
76
+
77
+ del() {
78
+ net="$1"
79
+ export CNI_COMMAND=DEL CNI_CONTAINERID CNI_NETNS="$netns" CNI_IFNAME="$(cat "$net/ifname")" CNI_ARGS="$(cat "$net/args")" CNI_PATH
80
+ count=$(cat "$net/count")
81
+ previous=$(cat "$net/result.json" 2>/dev/null)
82
+ i=$count
83
+ while [ "$i" -ge 1 ]; do
84
+ type=$(cat "$net/$i.type")
85
+ if binary=$(plugin "$type"); then
86
+ input "$net/$i.conf" "$previous" | "$binary" > /dev/null 2>&1 || echo "the CNI plugin $type of the network $(cat "$net/name") failed to delete" >&2
87
+ fi
88
+ i=$((i - 1))
89
+ done
90
+ rm -f "$net/result.json"
91
+ }
92
+
93
+ networks=$(ls -d "$dir"/network/[0-9]* 2>/dev/null)
94
+ case "$command" in
95
+ add)
96
+ if ! mounted; then
97
+ if [ -z "$pid" ] || [ ! -e "/proc/$pid/ns/net" ]; then echo "the container has no process (its state: $state)" >&2; exit 1; fi
98
+ : > "$netns"
99
+ mount --bind "/proc/$pid/ns/net" "$netns" || exit 1
100
+ fi
101
+ for net in $networks; do
102
+ if ! add "$net"; then
103
+ for added in $networks; do del "$added"; done
104
+ umount "$netns" 2>/dev/null
105
+ rm -f "$netns"
106
+ exit 1
107
+ fi
108
+ done
109
+ first=$(printf '%s\\n' $networks | head -n 1)
110
+ address=$(sed -n 's/.*"address": *"\\([0-9a-fA-F.:]*\\)\\/.*/\\1/p' "$first/result.json" | head -n 1)
111
+ { cat "$dir/hosts.base"; if [ -n "$address" ]; then printf '%s\\t%s\\n' "$address" "$(cat "$dir/hostname")"; fi; } > "$dir/hosts"
112
+ ;;
113
+ del)
114
+ mounted || netns=""
115
+ for net in $(printf '%s\\n' $networks | sort -r); do del "$net"; done
116
+ if [ -n "$netns" ]; then umount "$netns" 2>/dev/null || umount -l "$netns" 2>/dev/null; fi
117
+ rm -f "$dir/network/netns"
118
+ ;;
119
+ esac
120
+ exit 0
121
+ `;
122
+ /**
123
+ * The integer of an address of IPv4
124
+ * @param address
125
+ */
126
+ function iPv4ToNumber(address) {
127
+ const parts = address.split('.').map(Number);
128
+ if (parts.length !== 4 || parts.some((part) => !Number.isInteger(part) || part < 0 || part > 255))
129
+ throw new Error(`The address ${address} is not an address of IPv4`);
130
+ return ((parts[0] << 24) >>> 0) + (parts[1] << 16) + (parts[2] << 8) + parts[3];
131
+ }
132
+ function numberToIPv4(value) {
133
+ return [value >>> 24, (value >>> 16) & 255, (value >>> 8) & 255, value & 255].join('.');
134
+ }
135
+ /**
136
+ * The first and the last addresses of a subnet (CIDR of IPv4)
137
+ * @param cidr
138
+ */
139
+ export function parseSubnet(cidr) {
140
+ const [address, prefixText] = cidr.split('/');
141
+ const prefix = Number(prefixText);
142
+ if (!Number.isInteger(prefix) || prefix < 8 || prefix > 30)
143
+ throw new Error(`The subnet ${cidr} is not a CIDR of IPv4 (/8 to /30)`);
144
+ const mask = prefix === 0 ? 0 : (0xffffffff << (32 - prefix)) >>> 0;
145
+ const network = (iPv4ToNumber(address) & mask) >>> 0;
146
+ return { network: network, broadcast: (network | (~mask >>> 0)) >>> 0, prefix: prefix, cidr: `${numberToIPv4(network)}/${prefix}` };
147
+ }
148
+ /**
149
+ * The integer of an address of IPv6
150
+ * @param address
151
+ */
152
+ function iPv6ToBigInt(address) {
153
+ if (!isIPv6(address))
154
+ throw new Error(`The address ${address} is not an address of IPv6`);
155
+ const [head, tail] = address.split('::');
156
+ //An address of IPv4 at its end (::ffff:1.2.3.4)
157
+ const ipv4 = (part) => part.includes('.') ? [(iPv4ToNumber(part) >>> 16).toString(16), (iPv4ToNumber(part) & 0xffff).toString(16)] : [part];
158
+ const headGroups = head ? head.split(':').flatMap(ipv4) : [];
159
+ const tailGroups = tail ? tail.split(':').flatMap(ipv4) : [];
160
+ const groups = tail === undefined ? headGroups : [...headGroups, ...Array(8 - headGroups.length - tailGroups.length).fill('0'), ...tailGroups];
161
+ return groups.reduce((value, group) => (value << 16n) | BigInt(parseInt(group || '0', 16)), 0n);
162
+ }
163
+ function bigIntToIPv6(value) {
164
+ const groups = [];
165
+ for (let index = 7; index >= 0; index--)
166
+ groups.push(((value >> BigInt(index * 16)) & 0xffffn).toString(16));
167
+ //The longest run of zeros compressed
168
+ let best = [-1, 0];
169
+ for (let start = 0; start < 8; start++) {
170
+ let length = 0;
171
+ while (start + length < 8 && groups[start + length] === '0')
172
+ length++;
173
+ if (length > best[1])
174
+ best = [start, length];
175
+ }
176
+ if (best[1] < 2)
177
+ return groups.join(':');
178
+ return `${groups.slice(0, best[0]).join(':')}::${groups.slice(best[0] + best[1]).join(':')}`;
179
+ }
180
+ /**
181
+ * A subnet of IPv6 (CIDR): its network, its prefix, its first address
182
+ * @param cidr
183
+ */
184
+ export function parseIPv6Subnet(cidr) {
185
+ const [address, prefixText] = cidr.split('/');
186
+ const prefix = Number(prefixText);
187
+ if (!Number.isInteger(prefix) || prefix < 8 || prefix > 126)
188
+ throw new Error(`The subnet ${cidr} is not a CIDR of IPv6 (/8 to /126)`);
189
+ const mask = ((1n << 128n) - 1n) ^ ((1n << BigInt(128 - prefix)) - 1n);
190
+ const network = iPv6ToBigInt(address) & mask;
191
+ return { cidr: `${bigIntToIPv6(network)}/${prefix}`, first: bigIntToIPv6(network + 1n), network: network, last: network | (((1n << 128n) - 1n) ^ mask) };
192
+ }
193
+ /**
194
+ * Whether two subnets overlap
195
+ * @param a
196
+ * @param b
197
+ */
198
+ function overlap(a, b) {
199
+ try {
200
+ const [x, y] = [parseSubnet(a), parseSubnet(b)];
201
+ return x.network <= y.broadcast && y.network <= x.broadcast;
202
+ }
203
+ catch {
204
+ return false;
205
+ }
206
+ }
207
+ /**
208
+ * Remove a bridge of the host: the rules of the firewall plugin isolating it (iptables), its interface (ip of iproute2,
209
+ * or of busybox); what the system cannot remove is left
210
+ * @param bridge
211
+ */
212
+ function removeBridge(bridge) {
213
+ for (const chain of ['CNI-ISOLATION-STAGE-1', 'CNI-ISOLATION-STAGE-2']) {
214
+ const rules = spawnSync('iptables', ['-w', '-S', chain], { encoding: 'utf8' });
215
+ if (rules.error || rules.status !== 0)
216
+ continue;
217
+ for (const rule of rules.stdout.split('\n')) {
218
+ //The rules naming the bridge: deleted as iptables writes them (their comments quoted)
219
+ if (!rule.startsWith('-A ') || !new RegExp(`(^| )-[io] ${bridge.replace(/\./g, '\\.')}( |$)`).test(rule))
220
+ continue;
221
+ spawnSync('/bin/sh', ['-c', `iptables -w -D ${rule.slice(3)}`], { stdio: 'ignore' });
222
+ }
223
+ }
224
+ if (existsSync(`/sys/class/net/${bridge}`))
225
+ spawnSync('ip', ['link', 'delete', bridge], { stdio: 'ignore' });
226
+ }
227
+ /**
228
+ * The networks of CNI of the machine (the configuration lists of its directory), the ones of nerdctl created and
229
+ * removed, the configurations of the networks of the containers written for their hooks
230
+ */
231
+ export class NetworkStore {
232
+ #cniVersion;
233
+ constructor(confDir, cniPath) {
234
+ this.confDir = confDir;
235
+ this.cniPath = cniPath;
236
+ }
237
+ /**
238
+ * The directories of the plugins which exist
239
+ */
240
+ pluginDirectories() {
241
+ return this.cniPath.filter((directory) => existsSync(directory));
242
+ }
243
+ /**
244
+ * The path of a plugin, undefined when it is not installed
245
+ * @param type
246
+ */
247
+ plugin(type) {
248
+ for (const directory of this.pluginDirectories()) {
249
+ const file = path.join(directory, type);
250
+ try {
251
+ accessSync(file, fsConstants.X_OK);
252
+ return file;
253
+ }
254
+ catch {
255
+ //Not there
256
+ }
257
+ }
258
+ return undefined;
259
+ }
260
+ /**
261
+ * The version of CNI of the configurations written: the newest one of the plugins (1.0.0, or 0.4.0)
262
+ */
263
+ cniVersion() {
264
+ if (this.#cniVersion)
265
+ return this.#cniVersion;
266
+ const bridge = this.plugin('bridge') ?? this.plugin('macvlan');
267
+ let versions = [];
268
+ if (bridge) {
269
+ try {
270
+ const result = spawnSync(bridge, [], { input: '', env: { ...process.env, CNI_COMMAND: 'VERSION' }, encoding: 'utf8', timeout: 10000 });
271
+ versions = JSON.parse(result.stdout).supportedVersions ?? [];
272
+ }
273
+ catch {
274
+ //An older plugin
275
+ }
276
+ }
277
+ this.#cniVersion = versions.includes('1.0.0') ? '1.0.0' : '0.4.0';
278
+ return this.#cniVersion;
279
+ }
280
+ /**
281
+ * A network of a configuration list
282
+ * @param file
283
+ * @param content
284
+ */
285
+ parse(file, content) {
286
+ let list;
287
+ try {
288
+ list = JSON.parse(content);
289
+ }
290
+ catch {
291
+ return undefined;
292
+ }
293
+ if (typeof list.name !== 'string')
294
+ return undefined;
295
+ const plugins = Array.isArray(list.plugins) ? list.plugins : [list];
296
+ const subnets = [];
297
+ const gateways = [];
298
+ for (const plugin of plugins) {
299
+ for (const range of plugin.ipam?.ranges ?? []) {
300
+ for (const item of range) {
301
+ if (item.subnet)
302
+ subnets.push(item.subnet);
303
+ if (item.gateway)
304
+ gateways.push(item.gateway);
305
+ }
306
+ }
307
+ if (plugin.ipam?.subnet)
308
+ subnets.push(plugin.ipam.subnet);
309
+ if (plugin.ipam?.gateway)
310
+ gateways.push(plugin.ipam.gateway);
311
+ }
312
+ return {
313
+ name: list.name,
314
+ id: typeof list.nerdctlID === 'string' ? list.nerdctlID : createHash('sha256').update(list.name).digest('hex'),
315
+ file: file,
316
+ labels: list.nerdctlLabels ?? {},
317
+ cniVersion: list.cniVersion ?? '0.4.0',
318
+ driver: plugins[0]?.type ?? '',
319
+ subnets: subnets,
320
+ gateways: gateways,
321
+ plugins: plugins,
322
+ managed: path.basename(file).startsWith('nerdctl-')
323
+ };
324
+ }
325
+ /**
326
+ * The networks of CNI of the machine
327
+ */
328
+ async list() {
329
+ let files;
330
+ try {
331
+ files = (await readdir(this.confDir)).filter((file) => file.endsWith('.conflist') || file.endsWith('.conf')).sort();
332
+ }
333
+ catch {
334
+ return [];
335
+ }
336
+ const networks = [];
337
+ for (const file of files) {
338
+ const network = this.parse(path.join(this.confDir, file), await readFile(path.join(this.confDir, file), 'utf8').catch(() => ''));
339
+ if (network && !networks.some((known) => known.name === network.name))
340
+ networks.push(network);
341
+ }
342
+ return networks;
343
+ }
344
+ /**
345
+ * A network, by its name or its identifier (or a prefix of it); the default one of nerdctl created when it is asked
346
+ * @param nameOrId
347
+ */
348
+ async get(nameOrId) {
349
+ const networks = await this.list();
350
+ const found = networks.find((network) => network.name === nameOrId)
351
+ ?? networks.find((network) => network.id === nameOrId)
352
+ ?? (nameOrId.length >= 3 ? networks.find((network) => network.id.startsWith(nameOrId)) : undefined);
353
+ if (found || nameOrId !== DEFAULT_NETWORK)
354
+ return found;
355
+ return await this.createDefault();
356
+ }
357
+ /**
358
+ * The plugins added after the main one, as nerdctl adds them (the ones installed)
359
+ * @param driver
360
+ * @protected
361
+ */
362
+ chainedPlugins(driver) {
363
+ const plugins = [{ type: 'portmap', capabilities: { portMappings: true } }];
364
+ if (driver === 'bridge' && this.plugin('firewall'))
365
+ plugins.push({ type: 'firewall', ingressPolicy: 'same-bridge' });
366
+ if (this.plugin('tuning'))
367
+ plugins.push({ type: 'tuning' });
368
+ return plugins;
369
+ }
370
+ /**
371
+ * Write a configuration list
372
+ * @param name
373
+ * @param id
374
+ * @param labels
375
+ * @param plugins
376
+ * @protected
377
+ */
378
+ async write(name, id, labels, plugins) {
379
+ const file = path.join(this.confDir, `nerdctl-${name}.conflist`);
380
+ const content = JSON.stringify({ cniVersion: this.cniVersion(), name: name, nerdctlID: id, nerdctlLabels: labels, plugins: plugins }, null, 2);
381
+ await mkdir(this.confDir, { recursive: true });
382
+ await writeFile(file, content + '\n', { flag: 'wx' });
383
+ return this.parse(file, content);
384
+ }
385
+ /**
386
+ * Create the default network of nerdctl (bridge, nerdctl0, 10.4.0.0/24)
387
+ * @protected
388
+ */
389
+ async createDefault() {
390
+ try {
391
+ return await this.write(DEFAULT_NETWORK, createHash('sha256').update(DEFAULT_NETWORK).digest('hex'), { 'nerdctl/default-network': 'true' }, [
392
+ {
393
+ type: 'bridge',
394
+ bridge: DEFAULT_BRIDGE,
395
+ isGateway: true,
396
+ ipMasq: true,
397
+ hairpinMode: true,
398
+ ipam: { ranges: [[{ gateway: '10.4.0.1', subnet: DEFAULT_SUBNET }]], routes: [{ dst: '0.0.0.0/0' }], type: 'host-local', dataDir: IPAM_DATA_DIR }
399
+ },
400
+ ...this.chainedPlugins('bridge')
401
+ ]);
402
+ }
403
+ catch (error) {
404
+ //Created meanwhile
405
+ if (error.code === 'EEXIST')
406
+ return (await this.list()).find((network) => network.name === DEFAULT_NETWORK);
407
+ throw error;
408
+ }
409
+ }
410
+ /**
411
+ * A free subnet of 10.4.0.0/16 (the ones of nerdctl)
412
+ * @param used
413
+ * @protected
414
+ */
415
+ freeSubnet(used) {
416
+ for (let third = 1; third < 256; third++) {
417
+ const subnet = `10.4.${third}.0/24`;
418
+ if (!used.some((other) => overlap(subnet, other)))
419
+ return subnet;
420
+ }
421
+ throw new Error('No subnet of 10.4.0.0/16 is free: give the subnet of the network');
422
+ }
423
+ /**
424
+ * Create a network (bridge, macvlan, ipvlan), as nerdctl network create does
425
+ * @param options
426
+ */
427
+ async create(options) {
428
+ if (!/^[a-zA-Z0-9][a-zA-Z0-9_.-]*$/.test(options.name))
429
+ throw new Error(`The name of a network "${options.name}" is not valid ([a-zA-Z0-9][a-zA-Z0-9_.-]*)`);
430
+ if (['host', 'none', DEFAULT_NETWORK].includes(options.name))
431
+ throw Object.assign(new Error(`The network ${options.name} is the one of the system`), { code: 'CONFLICT' });
432
+ const networks = await this.list();
433
+ if (networks.some((network) => network.name === options.name))
434
+ throw Object.assign(new Error(`The network ${options.name} exists`), { code: 'CONFLICT' });
435
+ const driver = options.driver ?? 'bridge';
436
+ if (!this.plugin(driver))
437
+ throw new Error(`The CNI plugin ${driver} is not installed (${this.cniPath.join(', ')})`);
438
+ const used = [DEFAULT_SUBNET, ...networks.flatMap((network) => network.subnets)];
439
+ const subnet = parseSubnet(options.subnet ?? this.freeSubnet(used));
440
+ const overlapping = used.find((other) => overlap(subnet.cidr, other));
441
+ if (options.subnet && overlapping)
442
+ throw Object.assign(new Error(`The subnet ${subnet.cidr} overlaps the one of another network (${overlapping})`), { code: 'CONFLICT' });
443
+ const gateway = options.gateway ?? numberToIPv4(subnet.network + 1);
444
+ const gatewayNumber = iPv4ToNumber(gateway);
445
+ if (gatewayNumber <= subnet.network || gatewayNumber >= subnet.broadcast)
446
+ throw new Error(`The gateway ${gateway} is not in the subnet ${subnet.cidr}`);
447
+ const range = { gateway: gateway, subnet: subnet.cidr };
448
+ if (options.ipRange) {
449
+ const ipRange = parseSubnet(options.ipRange);
450
+ if (ipRange.network < subnet.network || ipRange.broadcast > subnet.broadcast)
451
+ throw new Error(`The range ${options.ipRange} is not in the subnet ${subnet.cidr}`);
452
+ range.rangeStart = numberToIPv4(Math.max(ipRange.network + 1, subnet.network + 1));
453
+ range.rangeEnd = numberToIPv4(Math.min(ipRange.broadcast - 1, subnet.broadcast - 1));
454
+ }
455
+ const ipam = { ranges: [[range]], routes: options.internal ? [] : [{ dst: '0.0.0.0/0' }], type: 'host-local', dataDir: IPAM_DATA_DIR };
456
+ if (options.ipv6Subnet) {
457
+ const ipv6 = parseIPv6Subnet(options.ipv6Subnet);
458
+ const ipv6Gateway = options.ipv6Gateway ?? ipv6.first;
459
+ const gateway6 = iPv6ToBigInt(ipv6Gateway);
460
+ if (gateway6 <= ipv6.network || gateway6 > ipv6.last)
461
+ throw new Error(`The gateway ${ipv6Gateway} is not in the subnet ${ipv6.cidr}`);
462
+ const overlapping6 = networks.find((network) => network.subnets.some((other) => {
463
+ try {
464
+ const known = parseIPv6Subnet(other);
465
+ return known.network <= ipv6.last && ipv6.network <= known.last;
466
+ }
467
+ catch {
468
+ return false;
469
+ }
470
+ }));
471
+ if (overlapping6)
472
+ throw Object.assign(new Error(`The subnet ${ipv6.cidr} overlaps the one of the network ${overlapping6.name}`), { code: 'CONFLICT' });
473
+ ipam.ranges.push([{ subnet: ipv6.cidr, gateway: ipv6Gateway }]);
474
+ if (!options.internal)
475
+ ipam.routes.push({ dst: '::/0' });
476
+ }
477
+ const id = randomBytes(32).toString('hex');
478
+ let main;
479
+ if (driver === 'bridge') {
480
+ main = { type: 'bridge', bridge: `br-${id.slice(0, 12)}`, isGateway: !options.internal, ipMasq: !options.internal, hairpinMode: true, ipam: ipam };
481
+ }
482
+ else {
483
+ if (!options.parent)
484
+ throw new Error(`The ${driver} network ${options.name} needs the interface of the host (parent)`);
485
+ main = driver === 'macvlan' ? { type: 'macvlan', master: options.parent, mode: 'bridge', ipam: ipam } : { type: 'ipvlan', master: options.parent, mode: 'l2', ipam: ipam };
486
+ }
487
+ if (options.mtu)
488
+ main.mtu = options.mtu;
489
+ try {
490
+ return await this.write(options.name, id, options.labels ?? {}, [main, ...this.chainedPlugins(driver)]);
491
+ }
492
+ catch (error) {
493
+ if (error.code === 'EEXIST')
494
+ throw Object.assign(new Error(`The network ${options.name} exists`), { code: 'CONFLICT' });
495
+ throw error;
496
+ }
497
+ }
498
+ /**
499
+ * Remove a network (one of nerdctl): its configuration, its bridge and the rules of its firewall, the leases of its
500
+ * addresses, as nerdctl network rm does
501
+ * @param network
502
+ */
503
+ async remove(network) {
504
+ if (!network.managed)
505
+ throw new Error(`The network ${network.name} is not one of nerdctl (${network.file}): remove its configuration`);
506
+ if (network.labels['nerdctl/default-network'] === 'true')
507
+ throw Object.assign(new Error(`The network ${network.name} is the default one`), { code: 'CONFLICT' });
508
+ await rm(network.file, { force: true });
509
+ const main = network.plugins[0] ?? {};
510
+ if (main.type === 'bridge' && typeof main.bridge === 'string' && /^[\w.-]+$/.test(main.bridge))
511
+ removeBridge(main.bridge);
512
+ if (main.ipam?.dataDir === IPAM_DATA_DIR)
513
+ await rm(path.join(IPAM_DATA_DIR, network.name), { recursive: true, force: true });
514
+ }
515
+ /**
516
+ * Write the configurations of the networks of a container for its hooks (the configurations of their plugins, their
517
+ * runtime configurations: the ports published on the first one)
518
+ * @param stateDir
519
+ * @param containerId
520
+ * @param networks
521
+ * @param ports
522
+ */
523
+ async render(stateDir, containerId, networks, ports) {
524
+ const directory = path.join(stateDir, 'network');
525
+ await rm(directory, { recursive: true, force: true });
526
+ await mkdir(directory, { recursive: true });
527
+ const pluginPath = this.pluginDirectories().join(':');
528
+ await writeFile(path.join(directory, 'env'), [
529
+ `CNI_PATH='${pluginPath}'`,
530
+ `CNI_CONTAINERID='${containerId}'`,
531
+ `PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:${pluginPath}'`,
532
+ 'export CNI_PATH CNI_CONTAINERID PATH',
533
+ ''
534
+ ].join('\n'));
535
+ await writeFile(path.join(directory, 'hook.sh'), HOOK_SCRIPT, { mode: 0o755 });
536
+ for (let index = 0; index < networks.length; index++) {
537
+ const { network, ip, ipv6 } = networks[index];
538
+ const net = path.join(directory, String(index).padStart(2, '0'));
539
+ await mkdir(net);
540
+ await writeFile(path.join(net, 'name'), network.name);
541
+ await writeFile(path.join(net, 'ifname'), `eth${index}`);
542
+ const addresses = [ip, ipv6].filter((address) => !!address);
543
+ await writeFile(path.join(net, 'args'), ['IgnoreUnknown=1', ...addresses.length ? [`IP=${addresses.join(',')}`] : []].join(';'));
544
+ await writeFile(path.join(net, 'count'), String(network.plugins.length));
545
+ for (let position = 0; position < network.plugins.length; position++) {
546
+ const plugin = { ...network.plugins[position], name: network.name, cniVersion: network.cniVersion };
547
+ //The runtime configuration of the capabilities of the plugin (the ports on the first network)
548
+ if (plugin.capabilities?.portMappings && index === 0 && ports.length) {
549
+ plugin.runtimeConfig = { portMappings: ports.map((port) => ({ hostPort: port.hostPort, containerPort: port.containerPort, protocol: port.protocol, hostIP: port.hostIP ?? '' })) };
550
+ }
551
+ delete plugin.capabilities;
552
+ //Without its closing brace: the previous result is added by the hook
553
+ await writeFile(path.join(net, `${position + 1}.conf`), JSON.stringify(plugin).slice(0, -1));
554
+ await writeFile(path.join(net, `${position + 1}.type`), String(plugin.type));
555
+ }
556
+ }
557
+ }
558
+ /**
559
+ * Delete the networks of a container whose hook did not (its task killed with its shim): the hook run as runc runs
560
+ * it
561
+ * @param stateDir
562
+ */
563
+ async teardown(stateDir) {
564
+ const hook = path.join(stateDir, 'network', 'hook.sh');
565
+ if (!existsSync(hook))
566
+ return;
567
+ const results = (await readdir(path.join(stateDir, 'network')).catch(() => []))
568
+ .filter((entry) => /^\d+$/.test(entry) && existsSync(path.join(stateDir, 'network', entry, 'result.json')));
569
+ if (!results.length && !existsSync(path.join(stateDir, 'network', 'netns')))
570
+ return;
571
+ await new Promise((resolve) => {
572
+ const child = spawn('/bin/sh', [hook, 'del', stateDir], { stdio: ['pipe', 'ignore', 'ignore'] });
573
+ child.on('error', () => resolve());
574
+ child.on('close', () => resolve());
575
+ child.stdin.end('{}');
576
+ });
577
+ }
578
+ /**
579
+ * The interfaces of a container on its networks (their results of CNI)
580
+ * @param stateDir
581
+ */
582
+ async interfaces(stateDir) {
583
+ const directory = path.join(stateDir, 'network');
584
+ const entries = (await readdir(directory).catch(() => [])).filter((entry) => /^\d+$/.test(entry)).sort();
585
+ const interfaces = [];
586
+ for (const entry of entries) {
587
+ const net = path.join(directory, entry);
588
+ const name = await readFile(path.join(net, 'name'), 'utf8').catch(() => '');
589
+ const ifname = await readFile(path.join(net, 'ifname'), 'utf8').catch(() => '');
590
+ const item = { network: name, interface: ifname };
591
+ let result;
592
+ try {
593
+ result = JSON.parse(await readFile(path.join(net, 'result.json'), 'utf8'));
594
+ }
595
+ catch {
596
+ //Not added (the container is not running)
597
+ }
598
+ if (result) {
599
+ const index = (result.interfaces ?? []).findIndex((candidate) => candidate.name === ifname && !!candidate.sandbox);
600
+ if (index >= 0)
601
+ item.mac = result.interfaces[index].mac;
602
+ for (const ip of result.ips ?? []) {
603
+ if (ip.interface !== undefined && index >= 0 && ip.interface !== index)
604
+ continue;
605
+ const [address, prefix] = String(ip.address).split('/');
606
+ if (address.includes(':')) {
607
+ item.ipv6 ??= address;
608
+ item.ipv6Gateway ??= ip.gateway;
609
+ }
610
+ else if (!item.ip) {
611
+ item.ip = address;
612
+ item.prefixLength = Number(prefix);
613
+ item.gateway = ip.gateway;
614
+ }
615
+ }
616
+ }
617
+ interfaces.push(item);
618
+ }
619
+ return interfaces;
620
+ }
621
+ }