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  }