1+ package stacks
2+
3+ import (
4+ "github.com/pkg/errors"
5+ "github.com/spf13/cobra"
6+
7+ "github.com/cycloidio/cycloid-cli/cmd/cycloid/common"
8+ "github.com/cycloidio/cycloid-cli/cmd/cycloid/middleware"
9+ "github.com/cycloidio/cycloid-cli/internal/cyargs"
10+ "github.com/cycloidio/cycloid-cli/printer"
11+ "github.com/cycloidio/cycloid-cli/printer/factory"
12+ )
13+
14+ // CreateFromBlueprintOutput represents the formatted output for create-from-blueprint command
15+ type CreateFromBlueprintOutput struct {
16+ Canonical string `json:"canonical"`
17+ Name string `json:"name"`
18+ Ref string `json:"ref"`
19+ Description string `json:"description"`
20+ }
21+
22+ func NewCreateFromBlueprintCommand () * cobra.Command {
23+ var cmd = & cobra.Command {
24+ Use : "create-from-blueprint" ,
25+ Short : "create a new stack from a blueprint" ,
26+ Example : `cy --org my-org stack create-from-blueprint --blueprint-ref repo:blueprint-canonical --name "My Stack" --canonical my-stack --service-catalog-source-canonical my-catalog --use-case production` ,
27+ RunE : createFromBlueprint ,
28+ }
29+
30+ cmd .Flags ().String ("blueprint-ref" , "" , "Blueprint reference to use as template (required)" )
31+ cmd .MarkFlagRequired ("blueprint-ref" )
32+
33+ cmd .Flags ().String ("name" , "" , "Name of the new stack (required)" )
34+ cmd .MarkFlagRequired ("name" )
35+
36+ cmd .Flags ().String ("canonical" , "" , "Canonical name (slug) of the new stack (required)" )
37+ cmd .MarkFlagRequired ("canonical" )
38+
39+ cmd .Flags ().String ("service-catalog-source-canonical" , "" , "Service catalog source canonical (required)" )
40+ cmd .MarkFlagRequired ("service-catalog-source-canonical" )
41+
42+ cmd .Flags ().String ("use-case" , "" , "Use case canonical to apply from the blueprint (required)" )
43+ cmd .MarkFlagRequired ("use-case" )
44+
45+ return cmd
46+ }
47+
48+ func createFromBlueprint (cmd * cobra.Command , args []string ) error {
49+ api := common .NewAPI ()
50+ m := middleware .NewMiddleware (api )
51+
52+ org , err := cyargs .GetOrg (cmd )
53+ if err != nil {
54+ return err
55+ }
56+
57+ output , err := cyargs .GetOutput (cmd )
58+ if err != nil {
59+ return err
60+ }
61+
62+ // Get required flags
63+ blueprintRef , err := cmd .Flags ().GetString ("blueprint-ref" )
64+ if err != nil {
65+ return err
66+ }
67+
68+ name , err := cmd .Flags ().GetString ("name" )
69+ if err != nil {
70+ return err
71+ }
72+
73+ canonical , err := cmd .Flags ().GetString ("canonical" )
74+ if err != nil {
75+ return err
76+ }
77+
78+ serviceCatalogSourceCanonical , err := cmd .Flags ().GetString ("service-catalog-source-canonical" )
79+ if err != nil {
80+ return err
81+ }
82+
83+ useCase , err := cmd .Flags ().GetString ("use-case" )
84+ if err != nil {
85+ return err
86+ }
87+
88+ // fetch the printer from the factory
89+ p , err := factory .GetPrinter (output )
90+ if err != nil {
91+ return errors .Wrap (err , "unable to get printer" )
92+ }
93+
94+ // Create the stack from blueprint
95+ stack , err := m .CreateStackFromBlueprint (org , blueprintRef , name , canonical , serviceCatalogSourceCanonical , useCase )
96+ if err != nil {
97+ return printer .SmartPrint (p , nil , err , "failed to create stack from blueprint" , printer.Options {}, cmd .OutOrStdout ())
98+ }
99+
100+ // For JSON output, return all fields; for table output, return only specific fields
101+ if output == "json" {
102+ return printer .SmartPrint (p , stack , nil , "" , printer.Options {}, cmd .OutOrStdout ())
103+ }
104+
105+ // For table output, format to show only the requested fields
106+ formattedOutput := & CreateFromBlueprintOutput {
107+ Canonical : getStringValue (stack .Canonical ),
108+ Name : getStringValue (stack .Name ),
109+ Ref : getStringValue (stack .Ref ),
110+ Description : stack .Description ,
111+ }
112+
113+ return printer .SmartPrint (p , formattedOutput , nil , "" , printer.Options {}, cmd .OutOrStdout ())
114+ }
0 commit comments