network.go 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. package convert
  2. import (
  3. "strings"
  4. basictypes "github.com/docker/docker/api/types"
  5. networktypes "github.com/docker/docker/api/types/network"
  6. types "github.com/docker/docker/api/types/swarm"
  7. netconst "github.com/docker/libnetwork/datastore"
  8. swarmapi "github.com/docker/swarmkit/api"
  9. gogotypes "github.com/gogo/protobuf/types"
  10. )
  11. func networkAttachmentFromGRPC(na *swarmapi.NetworkAttachment) types.NetworkAttachment {
  12. if na != nil {
  13. return types.NetworkAttachment{
  14. Network: networkFromGRPC(na.Network),
  15. Addresses: na.Addresses,
  16. }
  17. }
  18. return types.NetworkAttachment{}
  19. }
  20. func networkFromGRPC(n *swarmapi.Network) types.Network {
  21. if n != nil {
  22. network := types.Network{
  23. ID: n.ID,
  24. Spec: types.NetworkSpec{
  25. IPv6Enabled: n.Spec.Ipv6Enabled,
  26. Internal: n.Spec.Internal,
  27. Attachable: n.Spec.Attachable,
  28. Ingress: IsIngressNetwork(n),
  29. IPAMOptions: ipamFromGRPC(n.Spec.IPAM),
  30. Scope: netconst.SwarmScope,
  31. },
  32. IPAMOptions: ipamFromGRPC(n.IPAM),
  33. }
  34. if n.Spec.GetNetwork() != "" {
  35. network.Spec.ConfigFrom = &networktypes.ConfigReference{
  36. Network: n.Spec.GetNetwork(),
  37. }
  38. }
  39. // Meta
  40. network.Version.Index = n.Meta.Version.Index
  41. network.CreatedAt, _ = gogotypes.TimestampFromProto(n.Meta.CreatedAt)
  42. network.UpdatedAt, _ = gogotypes.TimestampFromProto(n.Meta.UpdatedAt)
  43. //Annotations
  44. network.Spec.Annotations = annotationsFromGRPC(n.Spec.Annotations)
  45. //DriverConfiguration
  46. if n.Spec.DriverConfig != nil {
  47. network.Spec.DriverConfiguration = &types.Driver{
  48. Name: n.Spec.DriverConfig.Name,
  49. Options: n.Spec.DriverConfig.Options,
  50. }
  51. }
  52. //DriverState
  53. if n.DriverState != nil {
  54. network.DriverState = types.Driver{
  55. Name: n.DriverState.Name,
  56. Options: n.DriverState.Options,
  57. }
  58. }
  59. return network
  60. }
  61. return types.Network{}
  62. }
  63. func ipamFromGRPC(i *swarmapi.IPAMOptions) *types.IPAMOptions {
  64. var ipam *types.IPAMOptions
  65. if i != nil {
  66. ipam = &types.IPAMOptions{}
  67. if i.Driver != nil {
  68. ipam.Driver.Name = i.Driver.Name
  69. ipam.Driver.Options = i.Driver.Options
  70. }
  71. for _, config := range i.Configs {
  72. ipam.Configs = append(ipam.Configs, types.IPAMConfig{
  73. Subnet: config.Subnet,
  74. Range: config.Range,
  75. Gateway: config.Gateway,
  76. })
  77. }
  78. }
  79. return ipam
  80. }
  81. func endpointSpecFromGRPC(es *swarmapi.EndpointSpec) *types.EndpointSpec {
  82. var endpointSpec *types.EndpointSpec
  83. if es != nil {
  84. endpointSpec = &types.EndpointSpec{}
  85. endpointSpec.Mode = types.ResolutionMode(strings.ToLower(es.Mode.String()))
  86. for _, portState := range es.Ports {
  87. endpointSpec.Ports = append(endpointSpec.Ports, swarmPortConfigToAPIPortConfig(portState))
  88. }
  89. }
  90. return endpointSpec
  91. }
  92. func endpointFromGRPC(e *swarmapi.Endpoint) types.Endpoint {
  93. endpoint := types.Endpoint{}
  94. if e != nil {
  95. if espec := endpointSpecFromGRPC(e.Spec); espec != nil {
  96. endpoint.Spec = *espec
  97. }
  98. for _, portState := range e.Ports {
  99. endpoint.Ports = append(endpoint.Ports, swarmPortConfigToAPIPortConfig(portState))
  100. }
  101. for _, v := range e.VirtualIPs {
  102. endpoint.VirtualIPs = append(endpoint.VirtualIPs, types.EndpointVirtualIP{
  103. NetworkID: v.NetworkID,
  104. Addr: v.Addr})
  105. }
  106. }
  107. return endpoint
  108. }
  109. func swarmPortConfigToAPIPortConfig(portConfig *swarmapi.PortConfig) types.PortConfig {
  110. return types.PortConfig{
  111. Name: portConfig.Name,
  112. Protocol: types.PortConfigProtocol(strings.ToLower(swarmapi.PortConfig_Protocol_name[int32(portConfig.Protocol)])),
  113. PublishMode: types.PortConfigPublishMode(strings.ToLower(swarmapi.PortConfig_PublishMode_name[int32(portConfig.PublishMode)])),
  114. TargetPort: portConfig.TargetPort,
  115. PublishedPort: portConfig.PublishedPort,
  116. }
  117. }
  118. // BasicNetworkFromGRPC converts a grpc Network to a NetworkResource.
  119. func BasicNetworkFromGRPC(n swarmapi.Network) basictypes.NetworkResource {
  120. spec := n.Spec
  121. var ipam networktypes.IPAM
  122. if spec.IPAM != nil {
  123. if spec.IPAM.Driver != nil {
  124. ipam.Driver = spec.IPAM.Driver.Name
  125. ipam.Options = spec.IPAM.Driver.Options
  126. }
  127. ipam.Config = make([]networktypes.IPAMConfig, 0, len(spec.IPAM.Configs))
  128. for _, ic := range spec.IPAM.Configs {
  129. ipamConfig := networktypes.IPAMConfig{
  130. Subnet: ic.Subnet,
  131. IPRange: ic.Range,
  132. Gateway: ic.Gateway,
  133. AuxAddress: ic.Reserved,
  134. }
  135. ipam.Config = append(ipam.Config, ipamConfig)
  136. }
  137. }
  138. nr := basictypes.NetworkResource{
  139. ID: n.ID,
  140. Name: n.Spec.Annotations.Name,
  141. Scope: netconst.SwarmScope,
  142. EnableIPv6: spec.Ipv6Enabled,
  143. IPAM: ipam,
  144. Internal: spec.Internal,
  145. Attachable: spec.Attachable,
  146. Ingress: IsIngressNetwork(&n),
  147. Labels: n.Spec.Annotations.Labels,
  148. }
  149. if n.Spec.GetNetwork() != "" {
  150. nr.ConfigFrom = networktypes.ConfigReference{
  151. Network: n.Spec.GetNetwork(),
  152. }
  153. }
  154. if n.DriverState != nil {
  155. nr.Driver = n.DriverState.Name
  156. nr.Options = n.DriverState.Options
  157. }
  158. return nr
  159. }
  160. // BasicNetworkCreateToGRPC converts a NetworkCreateRequest to a grpc NetworkSpec.
  161. func BasicNetworkCreateToGRPC(create basictypes.NetworkCreateRequest) swarmapi.NetworkSpec {
  162. ns := swarmapi.NetworkSpec{
  163. Annotations: swarmapi.Annotations{
  164. Name: create.Name,
  165. Labels: create.Labels,
  166. },
  167. DriverConfig: &swarmapi.Driver{
  168. Name: create.Driver,
  169. Options: create.Options,
  170. },
  171. Ipv6Enabled: create.EnableIPv6,
  172. Internal: create.Internal,
  173. Attachable: create.Attachable,
  174. Ingress: create.Ingress,
  175. }
  176. if create.IPAM != nil {
  177. driver := create.IPAM.Driver
  178. if driver == "" {
  179. driver = "default"
  180. }
  181. ns.IPAM = &swarmapi.IPAMOptions{
  182. Driver: &swarmapi.Driver{
  183. Name: driver,
  184. Options: create.IPAM.Options,
  185. },
  186. }
  187. ipamSpec := make([]*swarmapi.IPAMConfig, 0, len(create.IPAM.Config))
  188. for _, ipamConfig := range create.IPAM.Config {
  189. ipamSpec = append(ipamSpec, &swarmapi.IPAMConfig{
  190. Subnet: ipamConfig.Subnet,
  191. Range: ipamConfig.IPRange,
  192. Gateway: ipamConfig.Gateway,
  193. })
  194. }
  195. ns.IPAM.Configs = ipamSpec
  196. }
  197. if create.ConfigFrom != nil {
  198. ns.ConfigFrom = &swarmapi.NetworkSpec_Network{
  199. Network: create.ConfigFrom.Network,
  200. }
  201. }
  202. return ns
  203. }
  204. // IsIngressNetwork check if the swarm network is an ingress network
  205. func IsIngressNetwork(n *swarmapi.Network) bool {
  206. if n.Spec.Ingress {
  207. return true
  208. }
  209. // Check if legacy defined ingress network
  210. _, ok := n.Spec.Annotations.Labels["com.docker.swarm.internal"]
  211. return ok && n.Spec.Annotations.Name == "ingress"
  212. }