@@ -14,13 +14,21 @@ See the Mulan PSL v2 for more details.
1414package demo
1515
1616import (
17+ "context"
18+ "log"
19+ "time"
20+
1721 "github.com/spf13/cobra"
22+ "k8s.io/apimachinery/pkg/types"
1823
24+ "github.com/oceanbase/ob-operator/api/v1alpha1"
1925 "github.com/oceanbase/ob-operator/internal/cli/cluster"
2026 "github.com/oceanbase/ob-operator/internal/cli/demo"
2127 "github.com/oceanbase/ob-operator/internal/cli/tenant"
2228 "github.com/oceanbase/ob-operator/internal/cli/utils"
2329 "github.com/oceanbase/ob-operator/internal/clients"
30+ clusterstatus "github.com/oceanbase/ob-operator/internal/const/status/obcluster"
31+ "github.com/oceanbase/ob-operator/internal/const/status/tenantstatus"
2432)
2533
2634// NewCmd create demo command for cluster creation
@@ -29,14 +37,16 @@ func NewCmd() *cobra.Command {
2937 tenantOptions := tenant .NewCreateOptions ()
3038 logger := utils .GetDefaultLoggerInstance ()
3139 pf := demo .NewPromptFactory ()
32- wait := false
40+ var clusterType string
41+ var wait bool
42+ var err error
3343 cmd := & cobra.Command {
3444 Use : "demo <subcommand>" ,
3545 Short : "deploy demo ob cluster and tenant in easier way" ,
3646 Long : `deploy demo ob cluster and tenant in easier way, currently support single node and three node cluster, with corresponding tenant` ,
37- Run : func ( cmd * cobra.Command , args [] string ) {
38- var err error
39- var clusterType string
47+ Args : cobra .NoArgs ,
48+ PreRun : func ( cmd * cobra. Command , args [] string ) {
49+ // prompt for cluster create options
4050 prompt := pf .CreatePrompt (cluster .FLAG_NAME )
4151 if clusterOptions .Name , err = pf .RunPromptE (prompt ); err != nil {
4252 logger .Fatalln (err )
@@ -53,6 +63,16 @@ func NewCmd() *cobra.Command {
5363 if clusterOptions .RootPassword , err = pf .RunPromptE (prompt ); err != nil {
5464 logger .Fatalln (err )
5565 }
66+ prompt = pf .CreatePrompt (tenant .FLAG_TENANT_NAME_IN_K8S )
67+ if tenantOptions .Name , err = pf .RunPromptE (prompt ); err != nil {
68+ logger .Fatalln (err )
69+ }
70+ prompt = pf .CreatePrompt (tenant .FLAG_TENANT_NAME )
71+ if tenantOptions .TenantName , err = pf .RunPromptE (prompt ); err != nil {
72+ logger .Fatalln (err )
73+ }
74+ },
75+ Run : func (cmd * cobra.Command , args []string ) {
5676 if err := clusterOptions .Complete (); err != nil {
5777 logger .Fatalln (err )
5878 }
@@ -65,23 +85,68 @@ func NewCmd() *cobra.Command {
6585 if err := demo .SetDefaultTenantConf (clusterType , clusterOptions .Namespace , clusterOptions .Name , tenantOptions ); err != nil {
6686 logger .Fatalln (err )
6787 }
68- obcluster := cluster .CreateOBClusterInstance (clusterOptions )
69- if err := clients .CreateSecretsForOBCluster (cmd .Context (), obcluster , clusterOptions .RootPassword ); err != nil {
70- logger .Fatalf ("failed to create secrets for ob cluster: %v" , err )
71- }
72- if _ , err := clients .CreateOBCluster (cmd .Context (), obcluster ); err != nil {
88+ obcluster , err := cluster .CreateOBCluster (cmd .Context (), clusterOptions )
89+ if err != nil {
7390 logger .Fatalln (err )
7491 }
75- logger .Printf ("Create OBCluster instance: %s" , clusterOptions .ClusterName )
76- logger .Printf ("Run `echo $(kubectl get secret %s -clusterOptions jsonpath='{.data.password}'|base64 --decode)` to get the secrets" , obcluster .Spec .UserSecrets .Root )
92+ logger .Printf ("Creating OBCluster instance: %s" , clusterOptions .ClusterName )
93+ waitForClusterReady (cmd .Context (), obcluster , logger , 2 * time .Second )
94+ logger .Printf ("Run `echo $(kubectl get secret %s -clusterOptions jsonpath='{.data.password}'|base64 --decode)` to get clsuter secrets" , obcluster .Spec .UserSecrets .Root )
95+ },
96+ PostRun : func (cmd * cobra.Command , args []string ) {
97+ // create tenant after cluster ready
7798 obtenant , err := tenant .CreateOBTenant (cmd .Context (), tenantOptions )
7899 if err != nil {
79100 logger .Fatalln (err )
80101 }
81- logger .Printf ("Create OBTenant instance: %s" , tenantOptions .TenantName )
82- logger .Printf ("Run `echo $(kubectl get secret %s -o jsonpath='{.data.password}'|base64 --decode)` to get the secrets" , obtenant .Spec .Credentials .Root )
102+ logger .Printf ("Creating OBTenant instance: %s" , tenantOptions .TenantName )
103+ waitForTenantReady (cmd .Context (), obtenant , logger , 1 * time .Second )
104+ logger .Printf ("Run `echo $(kubectl get secret %s -o jsonpath='{.data.password}'|base64 --decode)` to get tenant secrets" , obtenant .Spec .Credentials .Root )
83105 },
84106 }
107+ // TODO: if w is set, wait for the cluster and tenant ready
85108 cmd .Flags ().BoolVarP (& wait , cluster .FLAG_WAIT , "w" , cluster .DEFAULT_WAIT , "wait for the cluster and tenant ready" )
86109 return cmd
87110}
111+
112+ // waitForTenantReady wait for tenant ready, log the task status
113+ func waitForClusterReady (ctx context.Context , obcluster * v1alpha1.OBCluster , logger * log.Logger , waitTime time.Duration ) {
114+ var err error
115+ lastTask := ""
116+ lastTaskStatus := ""
117+ logger .Println ("Waiting for cluster ready..." )
118+ for obcluster .Status .Status != clusterstatus .Running {
119+ time .Sleep (waitTime )
120+ obcluster , err = clients .GetOBCluster (ctx , obcluster .Namespace , obcluster .Name )
121+ if err != nil {
122+ logger .Fatalln (err )
123+ }
124+ if obcluster .Status .OperationContext != nil && (lastTask != string (obcluster .Status .OperationContext .Task ) || lastTaskStatus != string (obcluster .Status .OperationContext .TaskStatus )) {
125+ logger .Printf ("Task: %s, Status: %s" , obcluster .Status .OperationContext .Task , obcluster .Status .OperationContext .TaskStatus )
126+ lastTask = string (obcluster .Status .OperationContext .Task )
127+ lastTaskStatus = string (obcluster .Status .OperationContext .TaskStatus )
128+ }
129+ }
130+ logger .Println ("Cluster create successfully" )
131+ }
132+
133+ // waitForTenantReady wait for tenant ready, log the task status
134+ func waitForTenantReady (ctx context.Context , obtenant * v1alpha1.OBTenant , logger * log.Logger , waitTime time.Duration ) {
135+ var err error
136+ lastTask := ""
137+ lastTaskStatus := ""
138+ logger .Println ("Waiting for tenant ready..." )
139+ for obtenant .Status .Status != tenantstatus .Running {
140+ time .Sleep (waitTime )
141+ obtenant , err = clients .GetOBTenant (ctx , types.NamespacedName {Namespace : obtenant .Namespace , Name : obtenant .Name })
142+ if err != nil {
143+ logger .Fatalln (err )
144+ }
145+ if obtenant .Status .OperationContext != nil && (lastTask != string (obtenant .Status .OperationContext .Task ) || lastTaskStatus != string (obtenant .Status .OperationContext .TaskStatus )) {
146+ logger .Printf ("Task: %s, Status: %s" , obtenant .Status .OperationContext .Task , obtenant .Status .OperationContext .TaskStatus )
147+ lastTask = string (obtenant .Status .OperationContext .Task )
148+ lastTaskStatus = string (obtenant .Status .OperationContext .TaskStatus )
149+ }
150+ }
151+ logger .Println ("Tenant create successfully" )
152+ }
0 commit comments