Skip to content

Commit 1fdbd19

Browse files
Wrap errors appropriately and move CreateNewIngredientVersionRevision to inventory model
1 parent 7630e2b commit 1fdbd19

File tree

3 files changed

+105
-98
lines changed

3 files changed

+105
-98
lines changed

cmd/state-mcp/internal/registry/tools.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -262,23 +262,23 @@ func CreateIngredientRevisionTool() Tool {
262262
Handler: func(ctx context.Context, p *primer.Values, mcpRequest mcp.CallToolRequest) (*mcp.CallToolResult, error) {
263263
namespace, err := mcpRequest.RequireString("namespace")
264264
if err != nil {
265-
return mcp.NewToolResultError(fmt.Sprintf("an ingredient namespace is required: %s", errs.JoinMessage(err))), nil
265+
return mcp.NewToolResultError(fmt.Sprintf("an ingredient namespace str is required: %s", errs.JoinMessage(err))), nil
266266
}
267267
name, err := mcpRequest.RequireString("name")
268268
if err != nil {
269-
return mcp.NewToolResultError(fmt.Sprintf("an ingredient name is required: %s", errs.JoinMessage(err))), nil
269+
return mcp.NewToolResultError(fmt.Sprintf("an ingredient name str is required: %s", errs.JoinMessage(err))), nil
270270
}
271271
version, err := mcpRequest.RequireString("version")
272272
if err != nil {
273-
return mcp.NewToolResultError(fmt.Sprintf("an ingredient version is required: %s", errs.JoinMessage(err))), nil
273+
return mcp.NewToolResultError(fmt.Sprintf("an ingredient version str is required: %s", errs.JoinMessage(err))), nil
274274
}
275275
dependencies, err := mcpRequest.RequireString("dependencies")
276276
if err != nil {
277-
return mcp.NewToolResultError(fmt.Sprintf("the ingredient dependencies are required: %s", errs.JoinMessage(err))), nil
277+
return mcp.NewToolResultError(fmt.Sprintf("the ingredient dependencies str is required: %s", errs.JoinMessage(err))), nil
278278
}
279279
comment, err := mcpRequest.RequireString("comment")
280280
if err != nil {
281-
return mcp.NewToolResultError(fmt.Sprintf("a comment for the ingredient is required: %s", errs.JoinMessage(err))), nil
281+
return mcp.NewToolResultError(fmt.Sprintf("a comment str for the ingredient is required: %s", errs.JoinMessage(err))), nil
282282
}
283283

284284
params := createrevision.NewParams(namespace, name, version, dependencies, comment)

internal/runners/mcp/createrevision/createrevision.go

Lines changed: 6 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,13 @@ package createrevision
22

33
import (
44
"encoding/json"
5-
"fmt"
65

6+
"github.com/ActiveState/cli/internal/errs"
77
"github.com/ActiveState/cli/internal/output"
88
"github.com/ActiveState/cli/internal/primer"
9-
"github.com/ActiveState/cli/pkg/platform/api/inventory"
10-
"github.com/ActiveState/cli/pkg/platform/api/inventory/inventory_client/inventory_operations"
119
"github.com/ActiveState/cli/pkg/platform/api/inventory/inventory_models"
1210
"github.com/ActiveState/cli/pkg/platform/authentication"
1311
"github.com/ActiveState/cli/pkg/platform/model"
14-
"github.com/go-openapi/strfmt"
1512
)
1613

1714
type CreateRevisionRunner struct {
@@ -49,107 +46,23 @@ func (runner *CreateRevisionRunner) Run(params *Params) error {
4946
var dependencies []inventory_models.Dependency
5047
err := json.Unmarshal([]byte(params.dependencies), &dependencies)
5148
if err != nil {
52-
return fmt.Errorf("error unmarshaling dependencies, dependency JSON is in wrong format: %w", err)
49+
return errs.Wrap(err, "error unmarshaling dependencies, dependency JSON is in wrong format")
5350
}
5451

5552
// Retrieve ingredient version to access ingredient and version IDs
5653
ingredient, err := model.GetIngredientByNameAndVersion(params.namespace, params.name, params.version, nil, runner.auth)
5754
if err != nil {
58-
return fmt.Errorf("error fetching ingredient: %w", err)
55+
return errs.Wrap(err, "error fetching ingredient")
5956
}
6057

61-
// Retrieve its latest revision to copy all data - but comment and dependencies - from
62-
getParams := inventory_operations.NewGetIngredientVersionRevisionsParams()
63-
getParams.SetIngredientID(*ingredient.IngredientID)
64-
getParams.SetIngredientVersionID(*ingredient.IngredientVersionID)
65-
66-
client := inventory.Get(runner.auth)
67-
revisions, err := client.GetIngredientVersionRevisions(getParams, runner.auth.ClientAuth())
68-
if err != nil {
69-
return fmt.Errorf("error getting version revisions: %w", err)
70-
}
71-
revision := revisions.Payload.IngredientVersionRevisions[len(revisions.Payload.IngredientVersionRevisions)-1]
72-
73-
// Prepare new ingredient version revision params to create a new revision
74-
// This leaves all the attributes untouched, but dependencies and comments
75-
newParams := inventory_operations.NewAddIngredientVersionRevisionParams()
76-
newParams.SetIngredientID(*ingredient.IngredientID)
77-
newParams.SetIngredientVersionID(*ingredient.IngredientVersionID)
78-
79-
// Extract build script IDs
80-
var buildScriptIDs []strfmt.UUID
81-
for _, script := range revision.BuildScripts {
82-
buildScriptIDs = append(buildScriptIDs, *script.BuildScriptID)
83-
}
84-
85-
// Replicate patches
86-
var patches []*inventory_models.IngredientVersionRevisionCreatePatch
87-
for _, patch := range revision.Patches {
88-
patches = append(patches, &inventory_models.IngredientVersionRevisionCreatePatch{
89-
PatchID: patch.PatchID,
90-
SequenceNumber: patch.SequenceNumber,
91-
})
92-
}
93-
94-
// Retrieve and prepare default and override option sets
95-
optsetParams := inventory_operations.NewGetIngredientVersionIngredientOptionSetsParams()
96-
optsetParams.SetIngredientID(*ingredient.IngredientID)
97-
optsetParams.SetIngredientVersionID(*ingredient.IngredientVersionID)
98-
99-
response, err := client.GetIngredientVersionIngredientOptionSets(optsetParams, runner.auth.ClientAuth())
100-
if err != nil {
101-
return fmt.Errorf("error getting optsets: %w", err)
102-
}
103-
104-
var default_optsets []strfmt.UUID
105-
var override_optsets []strfmt.UUID
106-
for _, optset := range response.Payload.IngredientOptionSetsWithUsageType {
107-
switch *optset.UsageType {
108-
case "default":
109-
default_optsets = append(default_optsets, *optset.IngredientOptionSetID)
110-
case "override":
111-
override_optsets = append(override_optsets, *optset.IngredientOptionSetID)
112-
}
113-
}
114-
115-
// Create and set the new revision object from model, setting the reason as manual change
116-
manual_change := inventory_models.IngredientVersionRevisionCoreReasonManualChange
117-
new_revision := inventory_models.IngredientVersionRevisionCreate{
118-
IngredientVersionRevisionCore: inventory_models.IngredientVersionRevisionCore{
119-
Comment: &params.comment,
120-
ProvidedFeatures: revision.ProvidedFeatures,
121-
Reason: &manual_change,
122-
ActivestateLicenseExpression: revision.ActivestateLicenseExpression,
123-
AuthorPlatformUserID: revision.AuthorPlatformUserID,
124-
CamelExtras: revision.CamelExtras,
125-
Dependencies: dependencies,
126-
IsIndemnified: revision.IsIndemnified,
127-
IsStableRelease: revision.IsStableRelease,
128-
IsStableRevision: revision.IsStableRevision,
129-
LicenseManifestURI: revision.LicenseManifestURI,
130-
PlatformSourceURI: revision.PlatformSourceURI,
131-
ScannerLicenseExpression: revision.ScannerLicenseExpression,
132-
SourceChecksum: revision.SourceChecksum,
133-
Status: revision.Status,
134-
},
135-
IngredientVersionRevisionCreateAllOf0: inventory_models.IngredientVersionRevisionCreateAllOf0{
136-
BuildScripts: buildScriptIDs,
137-
DefaultIngredientOptionSets: default_optsets,
138-
IngredientOptionSetOverrides: override_optsets,
139-
Patches: patches,
140-
},
141-
}
142-
newParams.SetIngredientVersionRevision(&new_revision)
143-
144-
// Create the new revision and output its marshalled string
145-
newRevision, err := client.AddIngredientVersionRevision(newParams, runner.auth.ClientAuth())
58+
newRevision, err := model.CreateNewIngredientVersionRevision(ingredient, params.comment, dependencies, runner.auth)
14659
if err != nil {
147-
return fmt.Errorf("error creating revision: %w", err)
60+
return errs.Wrap(err, "error creating ingredient version revision")
14861
}
14962

15063
marshalledRevision, err := json.Marshal(newRevision)
15164
if err != nil {
152-
return fmt.Errorf("error marshalling revision response: %w", err)
65+
return errs.Wrap(err, "error marshalling revision response")
15366
}
15467
runner.output.Print(string(marshalledRevision))
15568

pkg/platform/model/inventory.go

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -679,3 +679,97 @@ func FilterCurrentPlatform(hostPlatform string, platforms []strfmt.UUID, preferr
679679

680680
return platformIDs[0], nil
681681
}
682+
683+
// CreateNewIngredientVersionRevision creates a new revision for the provided ingredient.
684+
// The new revision only updates the comment and dependencies of the ingredient version, all further fields are kept as-is.
685+
func CreateNewIngredientVersionRevision(ingredient *inventory_models.FullIngredientVersion, comment string, dependencies []inventory_models.Dependency, auth *authentication.Auth) (*inventory_operations.AddIngredientVersionRevisionOK, error) {
686+
// Retrieve its latest revision to copy all data - but comment and dependencies - from
687+
getParams := inventory_operations.NewGetIngredientVersionRevisionsParams()
688+
getParams.SetIngredientID(*ingredient.IngredientID)
689+
getParams.SetIngredientVersionID(*ingredient.IngredientVersionID)
690+
691+
client := inventory.Get(auth)
692+
revisions, err := client.GetIngredientVersionRevisions(getParams, auth.ClientAuth())
693+
if err != nil {
694+
return nil, errs.Wrap(err, "error getting version revisions")
695+
}
696+
revision := revisions.Payload.IngredientVersionRevisions[len(revisions.Payload.IngredientVersionRevisions)-1]
697+
698+
// Prepare new ingredient version revision params to create a new revision
699+
// This leaves all the attributes untouched, but dependencies and comments
700+
newParams := inventory_operations.NewAddIngredientVersionRevisionParams()
701+
newParams.SetIngredientID(*ingredient.IngredientID)
702+
newParams.SetIngredientVersionID(*ingredient.IngredientVersionID)
703+
704+
// Extract build script IDs
705+
var buildScriptIDs []strfmt.UUID
706+
for _, script := range revision.BuildScripts {
707+
buildScriptIDs = append(buildScriptIDs, *script.BuildScriptID)
708+
}
709+
710+
// Replicate patches
711+
var patches []*inventory_models.IngredientVersionRevisionCreatePatch
712+
for _, patch := range revision.Patches {
713+
patches = append(patches, &inventory_models.IngredientVersionRevisionCreatePatch{
714+
PatchID: patch.PatchID,
715+
SequenceNumber: patch.SequenceNumber,
716+
})
717+
}
718+
719+
// Retrieve and prepare default and override option sets
720+
optsetParams := inventory_operations.NewGetIngredientVersionIngredientOptionSetsParams()
721+
optsetParams.SetIngredientID(*ingredient.IngredientID)
722+
optsetParams.SetIngredientVersionID(*ingredient.IngredientVersionID)
723+
724+
response, err := client.GetIngredientVersionIngredientOptionSets(optsetParams, auth.ClientAuth())
725+
if err != nil {
726+
return nil, errs.Wrap(err, "error getting optsets")
727+
}
728+
729+
var default_optsets []strfmt.UUID
730+
var override_optsets []strfmt.UUID
731+
for _, optset := range response.Payload.IngredientOptionSetsWithUsageType {
732+
switch *optset.UsageType {
733+
case "default":
734+
default_optsets = append(default_optsets, *optset.IngredientOptionSetID)
735+
case "override":
736+
override_optsets = append(override_optsets, *optset.IngredientOptionSetID)
737+
}
738+
}
739+
740+
// Create and set the new revision object from model, setting the reason as manual change
741+
manual_change := inventory_models.IngredientVersionRevisionCoreReasonManualChange
742+
new_revision := inventory_models.IngredientVersionRevisionCreate{
743+
IngredientVersionRevisionCore: inventory_models.IngredientVersionRevisionCore{
744+
Comment: &comment,
745+
ProvidedFeatures: revision.ProvidedFeatures,
746+
Reason: &manual_change,
747+
ActivestateLicenseExpression: revision.ActivestateLicenseExpression,
748+
AuthorPlatformUserID: revision.AuthorPlatformUserID,
749+
CamelExtras: revision.CamelExtras,
750+
Dependencies: dependencies,
751+
IsIndemnified: revision.IsIndemnified,
752+
IsStableRelease: revision.IsStableRelease,
753+
IsStableRevision: revision.IsStableRevision,
754+
LicenseManifestURI: revision.LicenseManifestURI,
755+
PlatformSourceURI: revision.PlatformSourceURI,
756+
ScannerLicenseExpression: revision.ScannerLicenseExpression,
757+
SourceChecksum: revision.SourceChecksum,
758+
Status: revision.Status,
759+
},
760+
IngredientVersionRevisionCreateAllOf0: inventory_models.IngredientVersionRevisionCreateAllOf0{
761+
BuildScripts: buildScriptIDs,
762+
DefaultIngredientOptionSets: default_optsets,
763+
IngredientOptionSetOverrides: override_optsets,
764+
Patches: patches,
765+
},
766+
}
767+
newParams.SetIngredientVersionRevision(&new_revision)
768+
769+
// Create the new revision and output its marshalled string
770+
newRevision, err := client.AddIngredientVersionRevision(newParams, auth.ClientAuth())
771+
if err != nil {
772+
return nil, errs.Wrap(err, "error creating revision")
773+
}
774+
return newRevision, nil
775+
}

0 commit comments

Comments
 (0)