Skip to content

Commit 992a3b3

Browse files
juli4nHavenXia
authored andcommitted
Rework Create endpoints to align with API style guide.
* Take resource message in the request. * Return resource message.
1 parent f1b69e9 commit 992a3b3

12 files changed

Lines changed: 544 additions & 584 deletions

File tree

cmd/ateapi/internal/controlapi/create_actor.go

Lines changed: 45 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -29,37 +29,44 @@ import (
2929
"k8s.io/apimachinery/pkg/util/validation/field"
3030
)
3131

32-
func (s *Service) CreateActor(ctx context.Context, req *ateapipb.CreateActorRequest) (*ateapipb.CreateActorResponse, error) {
32+
func (s *Service) CreateActor(ctx context.Context, req *ateapipb.CreateActorRequest) (*ateapipb.Actor, error) {
3333
if err := validateCreateActorRequest(req); err != nil {
3434
return nil, err
3535
}
36-
_, err := s.actorTemplateLister.ActorTemplates(req.GetActorTemplateNamespace()).Get(req.GetActorTemplateName())
36+
37+
in := req.GetActor()
38+
templateNamespace := in.GetActorTemplateNamespace()
39+
templateName := in.GetActorTemplateName()
40+
41+
_, err := s.actorTemplateLister.ActorTemplates(templateNamespace).Get(templateName)
3742
if err != nil {
3843
if k8serrors.IsNotFound(err) {
39-
return nil, status.Errorf(codes.FailedPrecondition, "ActorTemplate %s/%s not found", req.GetActorTemplateNamespace(), req.GetActorTemplateName())
44+
return nil, status.Errorf(codes.FailedPrecondition, "ActorTemplate %s/%s not found", templateNamespace, templateName)
4045
}
4146
return nil, fmt.Errorf("while getting ActorTemplate: %w", err)
4247
}
4348

49+
atespace := in.GetMetadata().GetAtespace()
50+
name := in.GetMetadata().GetName()
51+
4452
// The atespace must already exist.
45-
exists, err := s.persistence.AtespaceExists(ctx, req.GetActor().GetAtespace())
53+
exists, err := s.persistence.AtespaceExists(ctx, atespace)
4654
if err != nil {
4755
return nil, fmt.Errorf("while checking atespace: %w", err)
4856
}
4957
if !exists {
50-
return nil, status.Errorf(codes.FailedPrecondition, "Atespace %s not found", req.GetActor().GetAtespace())
58+
return nil, status.Errorf(codes.FailedPrecondition, "Atespace %s not found", atespace)
5159
}
5260

53-
name := req.GetActor().GetName()
5461
actor := &ateapipb.Actor{
5562
Metadata: &ateapipb.ResourceMetadata{
56-
Atespace: req.GetActor().GetAtespace(),
63+
Atespace: atespace,
5764
Name: name,
5865
},
5966
Status: ateapipb.Actor_STATUS_SUSPENDED,
60-
ActorTemplateNamespace: req.GetActorTemplateNamespace(),
61-
ActorTemplateName: req.GetActorTemplateName(),
62-
WorkerSelector: req.GetWorkerSelector(),
67+
ActorTemplateNamespace: templateNamespace,
68+
ActorTemplateName: templateName,
69+
WorkerSelector: in.GetWorkerSelector(),
6370
}
6471
stored, err := s.persistence.CreateActor(ctx, actor)
6572
if err != nil {
@@ -69,39 +76,49 @@ func (s *Service) CreateActor(ctx context.Context, req *ateapipb.CreateActorRequ
6976
return nil, fmt.Errorf("while recording actor: %w", err)
7077
}
7178

72-
return &ateapipb.CreateActorResponse{
73-
Actor: stored,
74-
}, nil
79+
return stored, nil
7580
}
7681

7782
func validateCreateActorRequest(req *ateapipb.CreateActorRequest) error {
7883
var fldPath *field.Path
7984
var errs field.ErrorList
8085

81-
if val, fldPath := req.ActorTemplateNamespace, fldPath.Child("actor_template_namespace"); val == "" {
82-
errs = append(errs, field.Required(fldPath, ""))
86+
actor := req.GetActor()
87+
actorPath := fldPath.Child("actor")
88+
if actor == nil {
89+
errs = append(errs, field.Required(actorPath, ""))
90+
return status.Error(codes.InvalidArgument, errs.ToAggregate().Error())
91+
}
92+
93+
metaPath := actorPath.Child("metadata")
94+
if val, p := actor.GetMetadata().GetAtespace(), metaPath.Child("atespace"); val == "" {
95+
errs = append(errs, field.Required(p, ""))
8396
} else {
84-
for _, msg := range content.IsDNS1123Label(val) {
85-
errs = append(errs, field.Invalid(fldPath, val, msg))
86-
}
97+
errs = append(errs, resources.ValidateResourceName(val, p)...)
98+
}
99+
if val, p := actor.GetMetadata().GetName(), metaPath.Child("name"); val == "" {
100+
errs = append(errs, field.Required(p, ""))
101+
} else {
102+
errs = append(errs, resources.ValidateResourceName(val, p)...)
87103
}
88104

89-
if val, fldPath := req.ActorTemplateName, fldPath.Child("actor_template_name"); val == "" {
90-
errs = append(errs, field.Required(fldPath, ""))
105+
if val, p := actor.GetActorTemplateNamespace(), actorPath.Child("actor_template_namespace"); val == "" {
106+
errs = append(errs, field.Required(p, ""))
91107
} else {
92-
for _, msg := range content.IsDNS1123Subdomain(val) {
93-
errs = append(errs, field.Invalid(fldPath, val, msg))
108+
for _, msg := range content.IsDNS1123Label(val) {
109+
errs = append(errs, field.Invalid(p, val, msg))
94110
}
95111
}
96-
97-
if val, fldPath := req.Actor, fldPath.Child("actor"); val == nil {
98-
errs = append(errs, field.Required(fldPath, ""))
112+
if val, p := actor.GetActorTemplateName(), actorPath.Child("actor_template_name"); val == "" {
113+
errs = append(errs, field.Required(p, ""))
99114
} else {
100-
errs = append(errs, resources.ValidateObjectRef(val, fldPath)...)
115+
for _, msg := range content.IsDNS1123Subdomain(val) {
116+
errs = append(errs, field.Invalid(p, val, msg))
117+
}
101118
}
102119

103-
if val := req.WorkerSelector; val != nil {
104-
errs = append(errs, validateSelector(val, fldPath.Child("worker_selector"))...)
120+
if val := actor.GetWorkerSelector(); val != nil {
121+
errs = append(errs, validateSelector(val, actorPath.Child("worker_selector"))...)
105122
}
106123

107124
if len(errs) > 0 {

cmd/ateapi/internal/controlapi/create_atespace.go

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,33 +24,55 @@ import (
2424
"github.com/agent-substrate/substrate/pkg/proto/ateapipb"
2525
"google.golang.org/grpc/codes"
2626
"google.golang.org/grpc/status"
27+
"k8s.io/apimachinery/pkg/util/validation/field"
2728
)
2829

29-
func (s *Service) CreateAtespace(ctx context.Context, req *ateapipb.CreateAtespaceRequest) (*ateapipb.CreateAtespaceResponse, error) {
30+
func (s *Service) CreateAtespace(ctx context.Context, req *ateapipb.CreateAtespaceRequest) (*ateapipb.Atespace, error) {
3031
if err := validateCreateAtespaceRequest(req); err != nil {
3132
return nil, err
3233
}
3334

35+
name := req.GetAtespace().GetMetadata().GetName()
3436
atespace := &ateapipb.Atespace{
35-
Metadata: &ateapipb.ResourceMetadata{Name: req.GetName()},
37+
Metadata: &ateapipb.ResourceMetadata{
38+
Name: name,
39+
},
3640
}
3741
stored, err := s.persistence.CreateAtespace(ctx, atespace)
3842
if err != nil {
3943
if errors.Is(err, store.ErrAlreadyExists) {
40-
return nil, status.Errorf(codes.AlreadyExists, "Atespace %s already exists", req.GetName())
44+
return nil, status.Errorf(codes.AlreadyExists, "Atespace %s already exists", name)
4145
}
4246
return nil, fmt.Errorf("while recording atespace: %w", err)
4347
}
4448

45-
return &ateapipb.CreateAtespaceResponse{Atespace: stored}, nil
49+
return stored, nil
4650
}
4751

4852
func validateCreateAtespaceRequest(req *ateapipb.CreateAtespaceRequest) error {
49-
if req.GetName() == "" {
50-
return status.Error(codes.InvalidArgument, "name is required")
53+
var fldPath *field.Path
54+
var errs field.ErrorList
55+
56+
atespace := req.GetAtespace()
57+
atespacePath := fldPath.Child("atespace")
58+
if atespace == nil {
59+
errs = append(errs, field.Required(atespacePath, ""))
60+
return status.Error(codes.InvalidArgument, errs.ToAggregate().Error())
61+
}
62+
63+
// Atespace is global-scoped: metadata.atespace must be empty, name required + valid.
64+
metaPath := atespacePath.Child("metadata")
65+
if val, p := atespace.GetMetadata().GetAtespace(), metaPath.Child("atespace"); val != "" {
66+
errs = append(errs, field.Invalid(p, val, "must be empty for a global-scoped resource"))
5167
}
52-
if err := resources.ValidateAtespace(req.GetName()); err != nil {
53-
return status.Error(codes.InvalidArgument, err.Error())
68+
if val, p := atespace.GetMetadata().GetName(), metaPath.Child("name"); val == "" {
69+
errs = append(errs, field.Required(p, ""))
70+
} else {
71+
errs = append(errs, resources.ValidateResourceName(val, p)...)
72+
}
73+
74+
if len(errs) > 0 {
75+
return status.Error(codes.InvalidArgument, errs.ToAggregate().Error())
5476
}
5577
return nil
5678
}

0 commit comments

Comments
 (0)