// AddService adds a new services to store. It validates the name // uniqueness and the IPVS uniqueness by saving the IPVS key // in the store, which consists in a combination of address, port // and protocol. func (s *FusisStore) AddService(svc *types.Service) error { svcKey := s.key("services", svc.GetId(), "config") ipvsKey := s.key("ipvs-ids", "services", svc.IpvsId()) // Validating service if err := s.validateService(svc); err != nil { return err } if err := s.validateServiceNameUniqueness(svcKey); err != nil { return err } if err := s.validateServiceIpvsUniqueness(ipvsKey); err != nil { return err } // TODO: Make the persistence of service and ipvs id atomic. // Pesisting service value, err := json.Marshal(svc) if err != nil { return errors.Wrapf(err, "error marshaling service: %v", svc) } err = s.kv.Put(svcKey, value, nil) if err != nil { return errors.Wrapf(err, "error sending service to store: %v", svc) } // Persisting IPVS key. So it can be validated. err = s.kv.Put(ipvsKey, []byte("true"), nil) if err != nil { return errors.Wrapf(err, "error sending service ipvs id to store: %v", svc.IpvsId()) } return nil }
func (s *FusisStore) DeleteService(svc *types.Service) error { // TODO: Make all these actions atomic key := s.key("services", svc.GetId()) err := s.kv.DeleteTree(key) if err != nil { return errors.Wrapf(err, "error trying to delete service: %v", svc) } ipvsKey := s.key("ipvs-ids", "services", svc.IpvsId()) err = s.kv.Delete(ipvsKey) if err != nil { return errors.Wrapf(err, "error trying to delete service ipvs id: %s", ipvsKey) } // Deleting dependent destionations dsts, err := s.GetDestinations() if err != nil { return errors.Wrapf(err, "get destinations from deleted service failed: %#v", svc) } for _, dst := range dsts { if dst.ServiceId == svc.GetId() { if err := s.DeleteDestination(svc, &dst); err != nil { return errors.Wrap(err, "deleting dependent destination failed") } } } // Deleting checks exists, err := s.kv.Exists(s.key("checks", svc.GetId())) if err != nil { return errors.Wrapf(err, "verifying health check to service: %s failed", svc.GetId()) } if exists { if err := s.DeleteCheck(types.CheckSpec{ServiceID: svc.GetId()}); err != nil { return errors.Wrap(err, "deleting dependent check failed") } } return nil }