Skip to content

Commit ca2f450

Browse files
authored
feat: Enhance extension resource ownership and metadata handling (#279)
- Updated descriptions in extensions.yaml to clarify owner reference requirements for system-scoped resources. - Modified create and update functions in sys_extension_resources.go to streamline response handling and improve error management. - Adjusted client methods to return the correct resource types and updated associated tests for consistency. Signed-off-by: Bailin He <bahe@equinix.com>
1 parent b044f7b commit ca2f450

7 files changed

Lines changed: 123 additions & 138 deletions

File tree

openapi/v1alpha1/components/schemas/extensions.yaml

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -123,10 +123,10 @@ ExtensionResourceMetadataOwnerRef:
123123
enum:
124124
- group
125125
- user
126-
description: Type of owner (group or user)
126+
description: Type of owner. For system-scoped resources, only 'group' is supported.
127127
id:
128128
type: string
129-
description: ID of the owner
129+
description: ID of the owner (group ID or user ID)
130130
required:
131131
- kind
132132
- id
@@ -136,8 +136,7 @@ ExtensionResourceMetadataCreateRequest:
136136
properties:
137137
owner_ref:
138138
$ref: '#/ExtensionResourceMetadataOwnerRef'
139-
required:
140-
- owner_ref
139+
description: Metadata for creating an extension resource. The owner_ref field is optional.
141140

142141
ExtensionResourceMetadataUpdateRequest:
143142
type: object
@@ -147,7 +146,7 @@ ExtensionResourceMetadataUpdateRequest:
147146
resource_version:
148147
type: integer
149148
format: int64
150-
description: Version number for optimistic concurrency control
149+
description: Version number for optimistic concurrency control. Required for updates to ensure the resource hasn't been modified.
151150

152151
ExtensionResourceStatus:
153152
type: object

openapi/v1alpha1/paths/extensions.yaml

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,10 @@ extension-resources:
351351
description: |
352352
Creates a new extension resource. The extension, kind, and version must be specified in the request body.
353353
The kind should use the singular slug form of the extension resource definition.
354+
355+
**Owner Reference:**
356+
- For system-scoped resources, you can optionally specify a group owner via metadata.owner_ref.kind (must be "group") and metadata.owner_ref.id (group UUID)
357+
- User-scoped resource ownership is not yet supported
354358
requestBody:
355359
required: true
356360
content:
@@ -377,7 +381,17 @@ extension-resources:
377381
schema:
378382
$ref: '../components/schemas.yaml#/ExtensionResource'
379383
'400':
380-
$ref: '../components/responses.yaml#/BadRequest'
384+
description: Bad Request (invalid owner_ref.kind, validation error, or resource constraint violation)
385+
content:
386+
application/json:
387+
schema:
388+
type: object
389+
properties:
390+
error:
391+
type: string
392+
examples:
393+
- "owner_ref.kind must be 'group' with system extension resources"
394+
- "validation error: resource constraint violation"
381395
'401':
382396
$ref: '../components/responses.yaml#/Unauthorized'
383397
'403':
@@ -410,8 +424,12 @@ extension-resources-id:
410424
Updates an existing extension resource. The extension, kind, and version must be specified in the request body.
411425
The kind should use the singular slug form of the extension resource definition.
412426
427+
**Optimistic Concurrency Control:**
413428
Optionally, you can provide metadata.resource_version for optimistic concurrency control to ensure the resource
414-
hasn't been modified since it was last read. You can also update status.messages to track resource state changes.
429+
hasn't been modified since it was last read.
430+
431+
**Status Updates:**
432+
You can also update status.messages to track resource state changes.
415433
parameters:
416434
- name: resource-id
417435
in: path
@@ -431,6 +449,9 @@ extension-resources-id:
431449
kind: "database"
432450
version: "v1"
433451
metadata:
452+
owner_ref:
453+
kind: "group"
454+
id: "550e8400-e29b-41d4-a716-446655440000"
434455
resource_version: 1234567890
435456
spec:
436457
name: "production-db"
@@ -447,7 +468,17 @@ extension-resources-id:
447468
schema:
448469
$ref: '../components/schemas.yaml#/ExtensionResource'
449470
'400':
450-
$ref: '../components/responses.yaml#/BadRequest'
471+
description: Bad Request (invalid owner_ref.kind, validation error, or resource constraint violation)
472+
content:
473+
application/json:
474+
schema:
475+
type: object
476+
properties:
477+
error:
478+
type: string
479+
examples:
480+
- "owner_ref.kind must be 'group' with system extension resources"
481+
- "validation error: resource constraint violation"
451482
'401':
452483
$ref: '../components/responses.yaml#/Unauthorized'
453484
'403':
@@ -591,8 +622,8 @@ resources-id:
591622
type: string
592623
description: Resource ID
593624
responses:
594-
'204':
595-
description: No content
625+
'202':
626+
description: Resource deleted
596627
security:
597628
- bearerAuth: []
598629
- oauth2ClientCredentials: ['governor:extensionresources:delete']

pkg/api/v1alpha1/extension_resources.go

Lines changed: 2 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -105,33 +105,7 @@ func (r *Router) createExtensionResource(c *gin.Context) {
105105
}
106106
}
107107

108-
res := createSystemExtensionResource(c, r.DB, r.EventBus, extension, erd, req.Spec, ownerID)
109-
if res == nil {
110-
return
111-
}
112-
113-
resp := &ExtensionResource{
114-
Extension: req.Extension,
115-
Kind: req.Kind,
116-
Version: req.Version,
117-
Spec: req.Spec,
118-
Metadata: ExtensionResourceMetadata{
119-
OwnerRef: req.Metadata.OwnerRef,
120-
CreatedAt: res.CreatedAt.Format(time.RFC3339),
121-
ID: res.ID,
122-
ResourceVersion: res.ResourceVersion,
123-
},
124-
Status: ExtensionResourceStatus{
125-
UpdatedAt: res.UpdatedAt.Format(time.RFC3339),
126-
},
127-
}
128-
129-
resp.Status.Messages = make([]json.RawMessage, len(res.Messages))
130-
for i, msg := range res.Messages {
131-
resp.Status.Messages[i] = json.RawMessage(msg)
132-
}
133-
134-
c.JSON(http.StatusCreated, resp)
108+
createSystemExtensionResource(c, r.DB, r.EventBus, extension, erd, req.Spec, ownerID)
135109
}
136110

137111
func (r *Router) updateExtensionResource(c *gin.Context) {
@@ -194,34 +168,5 @@ func (r *Router) updateExtensionResource(c *gin.Context) {
194168
r.Logger.Debug("current resource version", zap.Int64("resource_version", *rv))
195169
}
196170

197-
res := updateSystemExtensionResource(c, r.DB, r.EventBus, extension, erd, rid, req.Spec, msgs, rv)
198-
if res == nil {
199-
return
200-
}
201-
202-
resp := &ExtensionResource{}
203-
204-
resp.Extension = req.Extension
205-
resp.Kind = req.Kind
206-
resp.Version = req.Version
207-
resp.Metadata.CreatedAt = res.CreatedAt.Format(time.RFC3339)
208-
resp.Metadata.ID = res.ID
209-
resp.Metadata.ResourceVersion = res.ResourceVersion
210-
211-
if res.OwnerID.Valid && res.OwnerID.String != "" {
212-
resp.Metadata.OwnerRef = ExtensionResourceMetadataOwnerRef{
213-
Kind: ExtensionResourceOwnerKindGroup,
214-
ID: res.OwnerID.String,
215-
}
216-
}
217-
218-
resp.Spec = json.RawMessage(res.Resource)
219-
resp.Status.UpdatedAt = res.UpdatedAt.Format(time.RFC3339)
220-
221-
resp.Status.Messages = make([]json.RawMessage, len(res.Messages))
222-
for i, msg := range res.Messages {
223-
resp.Status.Messages[i] = json.RawMessage(msg)
224-
}
225-
226-
c.JSON(http.StatusAccepted, resp)
171+
updateSystemExtensionResource(c, r.DB, r.EventBus, extension, erd, rid, req.Spec, msgs, rv)
227172
}

0 commit comments

Comments
 (0)