network.go 5.7 KB

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