github.com/noxiouz/docker@v0.7.3-0.20160629055221-3d231c78e8c5/daemon/cluster/convert/service.go (about)

     1  package convert
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  
     7  	"github.com/docker/docker/pkg/namesgenerator"
     8  	types "github.com/docker/engine-api/types/swarm"
     9  	swarmapi "github.com/docker/swarmkit/api"
    10  	"github.com/docker/swarmkit/protobuf/ptypes"
    11  )
    12  
    13  // ServiceFromGRPC converts a grpc Service to a Service.
    14  func ServiceFromGRPC(s swarmapi.Service) types.Service {
    15  	spec := s.Spec
    16  	containerConfig := spec.Task.Runtime.(*swarmapi.TaskSpec_Container).Container
    17  
    18  	networks := make([]types.NetworkAttachmentConfig, 0, len(spec.Networks))
    19  	for _, n := range spec.Networks {
    20  		networks = append(networks, types.NetworkAttachmentConfig{Target: n.Target, Aliases: n.Aliases})
    21  	}
    22  	service := types.Service{
    23  		ID: s.ID,
    24  
    25  		Spec: types.ServiceSpec{
    26  			TaskTemplate: types.TaskSpec{
    27  				ContainerSpec: containerSpecFromGRPC(containerConfig),
    28  				Resources:     resourcesFromGRPC(s.Spec.Task.Resources),
    29  				RestartPolicy: restartPolicyFromGRPC(s.Spec.Task.Restart),
    30  				Placement:     placementFromGRPC(s.Spec.Task.Placement),
    31  			},
    32  
    33  			Networks:     networks,
    34  			EndpointSpec: endpointSpecFromGRPC(s.Spec.Endpoint),
    35  		},
    36  		Endpoint: endpointFromGRPC(s.Endpoint),
    37  	}
    38  
    39  	// Meta
    40  	service.Version.Index = s.Meta.Version.Index
    41  	service.CreatedAt, _ = ptypes.Timestamp(s.Meta.CreatedAt)
    42  	service.UpdatedAt, _ = ptypes.Timestamp(s.Meta.UpdatedAt)
    43  
    44  	// Annotations
    45  	service.Spec.Name = s.Spec.Annotations.Name
    46  	service.Spec.Labels = s.Spec.Annotations.Labels
    47  
    48  	// UpdateConfig
    49  	if s.Spec.Update != nil {
    50  		service.Spec.UpdateConfig = &types.UpdateConfig{
    51  			Parallelism: s.Spec.Update.Parallelism,
    52  		}
    53  
    54  		service.Spec.UpdateConfig.Delay, _ = ptypes.Duration(&s.Spec.Update.Delay)
    55  	}
    56  
    57  	//Mode
    58  	switch t := s.Spec.GetMode().(type) {
    59  	case *swarmapi.ServiceSpec_Global:
    60  		service.Spec.Mode.Global = &types.GlobalService{}
    61  	case *swarmapi.ServiceSpec_Replicated:
    62  		service.Spec.Mode.Replicated = &types.ReplicatedService{
    63  			Replicas: &t.Replicated.Replicas,
    64  		}
    65  	}
    66  
    67  	return service
    68  }
    69  
    70  // ServiceSpecToGRPC converts a ServiceSpec to a grpc ServiceSpec.
    71  func ServiceSpecToGRPC(s types.ServiceSpec) (swarmapi.ServiceSpec, error) {
    72  	name := s.Name
    73  	if name == "" {
    74  		name = namesgenerator.GetRandomName(0)
    75  	}
    76  
    77  	networks := make([]*swarmapi.ServiceSpec_NetworkAttachmentConfig, 0, len(s.Networks))
    78  	for _, n := range s.Networks {
    79  		networks = append(networks, &swarmapi.ServiceSpec_NetworkAttachmentConfig{Target: n.Target, Aliases: n.Aliases})
    80  	}
    81  
    82  	spec := swarmapi.ServiceSpec{
    83  		Annotations: swarmapi.Annotations{
    84  			Name:   name,
    85  			Labels: s.Labels,
    86  		},
    87  		Task: swarmapi.TaskSpec{
    88  			Resources: resourcesToGRPC(s.TaskTemplate.Resources),
    89  		},
    90  		Networks: networks,
    91  	}
    92  
    93  	containerSpec, err := containerToGRPC(s.TaskTemplate.ContainerSpec)
    94  	if err != nil {
    95  		return swarmapi.ServiceSpec{}, err
    96  	}
    97  	spec.Task.Runtime = &swarmapi.TaskSpec_Container{Container: containerSpec}
    98  
    99  	restartPolicy, err := restartPolicyToGRPC(s.TaskTemplate.RestartPolicy)
   100  	if err != nil {
   101  		return swarmapi.ServiceSpec{}, err
   102  	}
   103  	spec.Task.Restart = restartPolicy
   104  
   105  	if s.TaskTemplate.Placement != nil {
   106  		spec.Task.Placement = &swarmapi.Placement{
   107  			Constraints: s.TaskTemplate.Placement.Constraints,
   108  		}
   109  	}
   110  
   111  	if s.UpdateConfig != nil {
   112  		spec.Update = &swarmapi.UpdateConfig{
   113  			Parallelism: s.UpdateConfig.Parallelism,
   114  			Delay:       *ptypes.DurationProto(s.UpdateConfig.Delay),
   115  		}
   116  	}
   117  
   118  	if s.EndpointSpec != nil {
   119  		if s.EndpointSpec.Mode != "" &&
   120  			s.EndpointSpec.Mode != types.ResolutionModeVIP &&
   121  			s.EndpointSpec.Mode != types.ResolutionModeDNSRR {
   122  			return swarmapi.ServiceSpec{}, fmt.Errorf("invalid resolution mode: %q", s.EndpointSpec.Mode)
   123  		}
   124  
   125  		spec.Endpoint = &swarmapi.EndpointSpec{}
   126  
   127  		spec.Endpoint.Mode = swarmapi.EndpointSpec_ResolutionMode(swarmapi.EndpointSpec_ResolutionMode_value[strings.ToUpper(string(s.EndpointSpec.Mode))])
   128  
   129  		for _, portConfig := range s.EndpointSpec.Ports {
   130  			spec.Endpoint.Ports = append(spec.Endpoint.Ports, &swarmapi.PortConfig{
   131  				Name:          portConfig.Name,
   132  				Protocol:      swarmapi.PortConfig_Protocol(swarmapi.PortConfig_Protocol_value[strings.ToUpper(string(portConfig.Protocol))]),
   133  				TargetPort:    portConfig.TargetPort,
   134  				PublishedPort: portConfig.PublishedPort,
   135  			})
   136  		}
   137  	}
   138  
   139  	//Mode
   140  	if s.Mode.Global != nil {
   141  		spec.Mode = &swarmapi.ServiceSpec_Global{
   142  			Global: &swarmapi.GlobalService{},
   143  		}
   144  	} else if s.Mode.Replicated != nil && s.Mode.Replicated.Replicas != nil {
   145  		spec.Mode = &swarmapi.ServiceSpec_Replicated{
   146  			Replicated: &swarmapi.ReplicatedService{Replicas: *s.Mode.Replicated.Replicas},
   147  		}
   148  	} else {
   149  		spec.Mode = &swarmapi.ServiceSpec_Replicated{
   150  			Replicated: &swarmapi.ReplicatedService{Replicas: 1},
   151  		}
   152  	}
   153  
   154  	return spec, nil
   155  }
   156  
   157  func resourcesFromGRPC(res *swarmapi.ResourceRequirements) *types.ResourceRequirements {
   158  	var resources *types.ResourceRequirements
   159  	if res != nil {
   160  		resources = &types.ResourceRequirements{}
   161  		if res.Limits != nil {
   162  			resources.Limits = &types.Resources{
   163  				NanoCPUs:    res.Limits.NanoCPUs,
   164  				MemoryBytes: res.Limits.MemoryBytes,
   165  			}
   166  		}
   167  		if res.Reservations != nil {
   168  			resources.Reservations = &types.Resources{
   169  				NanoCPUs:    res.Reservations.NanoCPUs,
   170  				MemoryBytes: res.Reservations.MemoryBytes,
   171  			}
   172  		}
   173  	}
   174  
   175  	return resources
   176  }
   177  
   178  func resourcesToGRPC(res *types.ResourceRequirements) *swarmapi.ResourceRequirements {
   179  	var reqs *swarmapi.ResourceRequirements
   180  	if res != nil {
   181  		reqs = &swarmapi.ResourceRequirements{}
   182  		if res.Limits != nil {
   183  			reqs.Limits = &swarmapi.Resources{
   184  				NanoCPUs:    res.Limits.NanoCPUs,
   185  				MemoryBytes: res.Limits.MemoryBytes,
   186  			}
   187  		}
   188  		if res.Reservations != nil {
   189  			reqs.Reservations = &swarmapi.Resources{
   190  				NanoCPUs:    res.Reservations.NanoCPUs,
   191  				MemoryBytes: res.Reservations.MemoryBytes,
   192  			}
   193  
   194  		}
   195  	}
   196  	return reqs
   197  }
   198  
   199  func restartPolicyFromGRPC(p *swarmapi.RestartPolicy) *types.RestartPolicy {
   200  	var rp *types.RestartPolicy
   201  	if p != nil {
   202  		rp = &types.RestartPolicy{}
   203  		rp.Condition = types.RestartPolicyCondition(strings.ToLower(p.Condition.String()))
   204  		if p.Delay != nil {
   205  			delay, _ := ptypes.Duration(p.Delay)
   206  			rp.Delay = &delay
   207  		}
   208  		if p.Window != nil {
   209  			window, _ := ptypes.Duration(p.Window)
   210  			rp.Window = &window
   211  		}
   212  
   213  		rp.MaxAttempts = &p.MaxAttempts
   214  	}
   215  	return rp
   216  }
   217  
   218  func restartPolicyToGRPC(p *types.RestartPolicy) (*swarmapi.RestartPolicy, error) {
   219  	var rp *swarmapi.RestartPolicy
   220  	if p != nil {
   221  		rp = &swarmapi.RestartPolicy{}
   222  		if condition, ok := swarmapi.RestartPolicy_RestartCondition_value[strings.ToUpper(string(p.Condition))]; ok {
   223  			rp.Condition = swarmapi.RestartPolicy_RestartCondition(condition)
   224  		} else if string(p.Condition) == "" {
   225  			rp.Condition = swarmapi.RestartOnAny
   226  		} else {
   227  			return nil, fmt.Errorf("invalid RestartCondition: %q", p.Condition)
   228  		}
   229  
   230  		if p.Delay != nil {
   231  			rp.Delay = ptypes.DurationProto(*p.Delay)
   232  		}
   233  		if p.Window != nil {
   234  			rp.Window = ptypes.DurationProto(*p.Window)
   235  		}
   236  		if p.MaxAttempts != nil {
   237  			rp.MaxAttempts = *p.MaxAttempts
   238  
   239  		}
   240  	}
   241  	return rp, nil
   242  }
   243  
   244  func placementFromGRPC(p *swarmapi.Placement) *types.Placement {
   245  	var r *types.Placement
   246  	if p != nil {
   247  		r = &types.Placement{}
   248  		r.Constraints = p.Constraints
   249  	}
   250  
   251  	return r
   252  }