code: func InterpolateService(origSpec *api.ServiceSpec) *api.ServiceSpec {
  	spec := origSpec.Copy()
  
  	container := spec.Task.GetContainer()
  	defaultContainer := Service.Task.GetContainer()
  	if container != nil {
  		if container.StopGracePeriod == nil {
  			container.StopGracePeriod = &gogotypes.Duration{}
  			deepcopy.Copy(container.StopGracePeriod, defaultContainer.StopGracePeriod)
  		}
  		if container.PullOptions == nil {
  			container.PullOptions = defaultContainer.PullOptions.Copy()
  		}
  		if container.DNSConfig == nil {
  			container.DNSConfig = defaultContainer.DNSConfig.Copy()
  		}
  	}
  
  	if spec.Task.Resources == nil {
  		spec.Task.Resources = Service.Task.Resources.Copy()
  	}
  
  	if spec.Task.Restart == nil {
  		spec.Task.Restart = Service.Task.Restart.Copy()
  	} else {
  		if spec.Task.Restart.Delay == nil {
  			spec.Task.Restart.Delay = &gogotypes.Duration{}
  			deepcopy.Copy(spec.Task.Restart.Delay, Service.Task.Restart.Delay)
  		}
  	}
  
  	if spec.Task.Placement == nil {
  		spec.Task.Placement = Service.Task.Placement.Copy()
  	}
  
  	if spec.Update == nil {
  		spec.Update = Service.Update.Copy()
  	} else {
  		if spec.Update.Monitor == nil {
  			spec.Update.Monitor = &gogotypes.Duration{}
  			deepcopy.Copy(spec.Update.Monitor, Service.Update.Monitor)
  		}
  	}
  
  	if spec.Rollback == nil {
  		spec.Rollback = Service.Rollback.Copy()
  	} else {
  		if spec.Rollback.Monitor == nil {
  			spec.Rollback.Monitor = &gogotypes.Duration{}
  			deepcopy.Copy(spec.Rollback.Monitor, Service.Rollback.Monitor)
  		}
  	}
  
  	return spec
  }
docs: // InterpolateService returns a ServiceSpec based on the provided spec, which
  // has all unspecified values filled in with default values.