Skip to content

Commit 53b80aa

Browse files
New Cluster metadata summary
Signed-off-by: Dipankar Das <65275144+dipankardas011@users.noreply.github.com>
1 parent ecd74a5 commit 53b80aa

5 files changed

Lines changed: 254 additions & 149 deletions

File tree

cmd/create.go

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"os"
1919
"time"
2020

21+
"github.com/ksctl/ksctl/v2/pkg/addons"
2122
"github.com/ksctl/ksctl/v2/pkg/provider/optimizer"
2223

2324
"github.com/fatih/color"
@@ -45,17 +46,42 @@ ksctl create --help
4546
Long: "It is used to create cluster with the given name from user",
4647

4748
Run: func(cmd *cobra.Command, args []string) {
48-
meta := controller.Metadata{}
49+
meta := controller.Metadata{
50+
ClusterName: "ggg",
51+
ClusterType: consts.ClusterTypeSelfMang,
52+
Provider: consts.CloudAws,
53+
Region: "us-east-1",
54+
StateLocation: consts.StoreLocal,
55+
K8sDistro: consts.K8sK3s,
56+
K8sVersion: "v1.25.0",
57+
NoCP: 3,
58+
NoWP: 1,
59+
NoDS: 3,
60+
NoMP: 1,
61+
ControlPlaneNodeType: "t2.micro",
62+
WorkerPlaneNodeType: "t2.micro",
63+
DataStoreNodeType: "t2.micro",
64+
LoadBalancerNodeType: "t2.micro",
65+
Addons: addons.ClusterAddons{
66+
{
67+
Name: "cilium",
68+
Label: "ksctl",
69+
IsCNI: true,
70+
},
71+
},
72+
}
4973

50-
k.baseMetadataFields(&meta)
74+
cli.NewBlueprintUI(os.Stdout).RenderClusterBlueprint(meta)
5175

52-
if meta.ClusterType == consts.ClusterTypeMang {
53-
k.metadataForManagedCluster(&meta)
54-
} else {
55-
k.metadataForSelfManagedCluster(&meta)
56-
}
76+
// k.baseMetadataFields(&meta)
77+
78+
// if meta.ClusterType == consts.ClusterTypeMang {
79+
// k.metadataForManagedCluster(&meta)
80+
// } else {
81+
// k.metadataForSelfManagedCluster(&meta)
82+
// }
5783

58-
k.l.Success(k.Ctx, "Created the cluster", "Name", meta.ClusterName)
84+
// k.l.Success(k.Ctx, "Created the cluster", "Name", meta.ClusterName)
5985
},
6086
}
6187

cmd/handle_meta.go

Lines changed: 2 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
package cmd
1616

1717
import (
18-
"encoding/json"
1918
"fmt"
2019
"os"
2120

@@ -210,128 +209,8 @@ func (k *KsctlCommand) handleManagedK8sVersion(meta *controllerMeta.Controller,
210209
}
211210

212211
func (k *KsctlCommand) metadataSummary(meta controller.Metadata) {
213-
// Add more space before the first box for better visual separation
214-
println()
215-
216-
k.l.Box(k.Ctx, "✨ Cluster Blueprint", "Summary of your planned Kubernetes cluster")
217-
218-
// Add consistent spacing between sections
219-
println()
220-
println()
221-
222-
// Main cluster attributes section
223-
{
224-
k.l.Box(k.Ctx, "🔑 Key Attributes", "Core configuration details")
225-
226-
headers := []string{"Attribute", "Value"}
227-
dd := [][]string{
228-
{"🔖 Cluster Name", meta.ClusterName},
229-
{"📍 Region", meta.Region},
230-
{"☁️ Cloud Provider", string(meta.Provider)},
231-
{"🏗️ Cluster Type", string(meta.ClusterType)},
232-
}
233-
234-
k.l.Table(k.Ctx, headers, dd)
235-
}
236-
237-
// Add consistent spacing between sections
238-
println()
239-
println()
240-
241-
// Infrastructure details section
242-
{
243-
if meta.NoCP > 0 || meta.NoWP > 0 || meta.NoDS > 0 || len(meta.ManagedNodeType) > 0 {
244-
k.l.Box(k.Ctx, "🖥️ Infrastructure", "Node configuration and topology")
245-
246-
headers := []string{"Component", "Specification"}
247-
dd := [][]string{}
248-
249-
if meta.NoCP > 0 {
250-
dd = append(dd, []string{"🎮 Control Plane", fmt.Sprintf("%d × %s", meta.NoCP, meta.ControlPlaneNodeType)})
251-
}
252-
if meta.NoWP > 0 {
253-
dd = append(dd, []string{"🔋 Worker Nodes", fmt.Sprintf("%d × %s", meta.NoWP, meta.WorkerPlaneNodeType)})
254-
}
255-
if meta.NoDS > 0 {
256-
dd = append(dd, []string{"💾 Etcd Nodes", fmt.Sprintf("%d × %s", meta.NoDS, meta.DataStoreNodeType)})
257-
}
258-
if meta.LoadBalancerNodeType != "" {
259-
dd = append(dd, []string{"⚖️ Load Balancer", meta.LoadBalancerNodeType})
260-
}
261-
if len(meta.ManagedNodeType) > 0 {
262-
dd = append(dd, []string{"🌐 Managed Nodes", fmt.Sprintf("%d × %s", meta.NoMP, meta.ManagedNodeType)})
263-
}
264-
265-
k.l.Table(k.Ctx, headers, dd)
266-
}
267-
}
268-
269-
// Add consistent spacing between sections
270-
println()
271-
println()
272-
273-
// Kubernetes configuration section
274-
{
275-
if meta.K8sDistro != "" || meta.EtcdVersion != "" || meta.K8sVersion != "" {
276-
k.l.Box(k.Ctx, "⚙️ Kubernetes Configuration", "Software versions and distributions")
277-
278-
headers := []string{"Component", "Version/Type"}
279-
dd := [][]string{}
280-
281-
if meta.K8sDistro != "" {
282-
dd = append(dd, []string{"🚀 Bootstrap Provider", string(meta.K8sDistro)})
283-
}
284-
if meta.K8sVersion != "" {
285-
dd = append(dd, []string{"🔄 Kubernetes Version", meta.K8sVersion})
286-
}
287-
if meta.EtcdVersion != "" {
288-
dd = append(dd, []string{"📦 Etcd Version", meta.EtcdVersion})
289-
}
290-
291-
k.l.Table(k.Ctx, headers, dd)
292-
}
293-
}
294-
295-
// Add consistent spacing between sections
296-
println()
297-
println()
298-
299-
// Addons section
300-
{
301-
if len(meta.Addons) > 0 {
302-
k.l.Box(k.Ctx, "🧩 Cluster Add-ons", "Additional components to be installed")
303-
304-
headers := []string{"Add-on", "Details"}
305-
dd := [][]string{}
306-
307-
for _, addon := range meta.Addons {
308-
v := struct {
309-
Label string
310-
IsCNI bool
311-
Config *string
312-
}{
313-
Label: addon.Label,
314-
IsCNI: addon.IsCNI,
315-
Config: addon.Config,
316-
}
317-
318-
b, err := json.MarshalIndent(v, "", " ")
319-
if err != nil {
320-
k.l.Error("Failed to marshal addon config", "Reason", err)
321-
os.Exit(1)
322-
}
323-
dd = append(dd, []string{addon.Name, string(b)})
324-
}
325-
326-
k.l.Table(k.Ctx, headers, dd)
327-
}
328-
}
329-
330-
// End summary note with extra spacing
331-
println()
332-
println()
333-
k.l.Note(k.Ctx, "Your cluster will be provisioned with these specifications")
334-
println()
212+
// Use the new interactive cluster summary
213+
cli.NewBlueprintUI(os.Stdout).RenderClusterBlueprint(meta)
335214
}
336215

337216
func (k *KsctlCommand) handleCNI(managedCNI addons.ClusterAddons, defaultOptionManaged string, ksctlCNI addons.ClusterAddons, defaultOptionKsctl string) (addons.ClusterAddons, error) {

go.mod

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@ go 1.24.1
55
require (
66
github.com/charmbracelet/bubbles v0.21.0
77
github.com/charmbracelet/bubbletea v1.3.4
8-
github.com/charmbracelet/lipgloss v1.1.0
8+
github.com/charmbracelet/lipgloss v1.1.1-0.20250404203927-76690c660834
99
github.com/creack/pty v1.1.24
1010
github.com/fatih/color v1.18.0
1111
github.com/ksctl/ksctl/v2 v2.4.4
1212
github.com/pterm/pterm v0.12.80
1313
github.com/rodaine/table v1.3.0
1414
github.com/spf13/cobra v1.9.1
1515
golang.org/x/mod v0.22.0
16-
golang.org/x/term v0.28.0
16+
golang.org/x/term v0.31.0
1717
k8s.io/client-go v0.32.2
1818
)
1919

@@ -65,7 +65,7 @@ require (
6565
github.com/chai2010/gettext-go v1.0.2 // indirect
6666
github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect
6767
github.com/charmbracelet/x/ansi v0.8.0 // indirect
68-
github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd // indirect
68+
github.com/charmbracelet/x/cellbuf v0.0.13 // indirect
6969
github.com/charmbracelet/x/term v0.2.1 // indirect
7070
github.com/containerd/console v1.0.3 // indirect
7171
github.com/containerd/containerd v1.7.23 // indirect
@@ -185,9 +185,9 @@ require (
185185
golang.org/x/crypto v0.32.0 // indirect
186186
golang.org/x/net v0.34.0 // indirect
187187
golang.org/x/oauth2 v0.23.0 // indirect
188-
golang.org/x/sync v0.11.0 // indirect
189-
golang.org/x/sys v0.30.0 // indirect
190-
golang.org/x/text v0.21.0 // indirect
188+
golang.org/x/sync v0.13.0 // indirect
189+
golang.org/x/sys v0.32.0 // indirect
190+
golang.org/x/text v0.24.0 // indirect
191191
golang.org/x/time v0.7.0 // indirect
192192
google.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7 // indirect
193193
google.golang.org/grpc v1.65.0 // indirect

go.sum

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -149,12 +149,12 @@ github.com/charmbracelet/bubbletea v1.3.4 h1:kCg7B+jSCFPLYRA52SDZjr51kG/fMUEoPoZ
149149
github.com/charmbracelet/bubbletea v1.3.4/go.mod h1:dtcUCyCGEX3g9tosuYiut3MXgY/Jsv9nKVdibKKRRXo=
150150
github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc h1:4pZI35227imm7yK2bGPcfpFEmuY1gc2YSTShr4iJBfs=
151151
github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc/go.mod h1:X4/0JoqgTIPSFcRA/P6INZzIuyqdFY5rm8tb41s9okk=
152-
github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY=
153-
github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30=
152+
github.com/charmbracelet/lipgloss v1.1.1-0.20250404203927-76690c660834 h1:ZR7e0ro+SZZiIZD7msJyA+NjkCNNavuiPBLgerbOziE=
153+
github.com/charmbracelet/lipgloss v1.1.1-0.20250404203927-76690c660834/go.mod h1:aKC/t2arECF6rNOnaKaVU6y4t4ZeHQzqfxedE/VkVhA=
154154
github.com/charmbracelet/x/ansi v0.8.0 h1:9GTq3xq9caJW8ZrBTe0LIe2fvfLR/bYXKTx2llXn7xE=
155155
github.com/charmbracelet/x/ansi v0.8.0/go.mod h1:wdYl/ONOLHLIVmQaxbIYEC/cRKOQyjTkowiI4blgS9Q=
156-
github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd h1:vy0GVL4jeHEwG5YOXDmi86oYw2yuYUGqz6a8sLwg0X8=
157-
github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs=
156+
github.com/charmbracelet/x/cellbuf v0.0.13 h1:/KBBKHuVRbq1lYx5BzEHBAFBP8VcQzJejZ/IA3iR28k=
157+
github.com/charmbracelet/x/cellbuf v0.0.13/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs=
158158
github.com/charmbracelet/x/exp/golden v0.0.0-20241011142426-46044092ad91 h1:payRxjMjKgx2PaCWLZ4p3ro9y97+TVLZNaRZgJwSVDQ=
159159
github.com/charmbracelet/x/exp/golden v0.0.0-20241011142426-46044092ad91/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U=
160160
github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ=
@@ -626,8 +626,8 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ
626626
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
627627
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
628628
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
629-
golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w=
630-
golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
629+
golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610=
630+
golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
631631
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
632632
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
633633
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -650,24 +650,24 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc
650650
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
651651
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
652652
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
653-
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
654-
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
653+
golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20=
654+
golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
655655
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
656656
golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
657657
golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
658658
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
659659
golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
660660
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
661-
golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg=
662-
golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek=
661+
golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o=
662+
golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw=
663663
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
664664
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
665665
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
666666
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
667667
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
668668
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
669-
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
670-
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
669+
golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0=
670+
golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU=
671671
golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ=
672672
golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
673673
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=

0 commit comments

Comments
 (0)