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