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