@@ -26,6 +26,7 @@ import (
2626 "strings"
2727
2828 "github.com/SovereignCloudStack/cluster-stack-operator/pkg/kubernetesversion"
29+ "github.com/SovereignCloudStack/cluster-stack-operator/pkg/version"
2930 "gopkg.in/yaml.v3"
3031)
3132
@@ -44,45 +45,45 @@ type CsmctlConfig struct {
4445}
4546
4647// GetCsmctlConfig returns CsmctlConfig.
47- func GetCsmctlConfig (path string ) (* CsmctlConfig , error ) {
48+ func GetCsmctlConfig (path string ) (CsmctlConfig , error ) {
4849 configPath := filepath .Join (path , "csmctl.yaml" )
4950 configFileData , err := os .ReadFile (filepath .Clean (configPath ))
5051 if err != nil {
51- return nil , fmt .Errorf ("failed to read csmctl config: %w" , err )
52+ return CsmctlConfig {} , fmt .Errorf ("failed to read csmctl config: %w" , err )
5253 }
5354
54- cs := & CsmctlConfig {}
55+ cs := CsmctlConfig {}
5556 if err := yaml .Unmarshal (configFileData , & cs ); err != nil {
56- return nil , fmt .Errorf ("failed to unmarshal csmctl yaml: %w" , err )
57+ return CsmctlConfig {} , fmt .Errorf ("failed to unmarshal csmctl yaml: %w" , err )
5758 }
5859
5960 if cs .Config .Provider .Type == "" {
60- return nil , fmt .Errorf ("provider type must not be empty" )
61+ return CsmctlConfig {} , fmt .Errorf ("provider type must not be empty" )
6162 }
6263
6364 if len (cs .Config .Provider .Type ) > 253 {
64- return nil , fmt .Errorf ("provider name must not be greater than 253" )
65+ return CsmctlConfig {} , fmt .Errorf ("provider name must not be greater than 253" )
6566 }
6667
6768 match , err := regexp .MatchString (`^[a-z0-9]([-a-z0-9]*[a-z0-9])?$` , cs .Config .Provider .Type )
6869 if err != nil {
69- return nil , fmt .Errorf ("failed to provider name match regex: %w" , err )
70+ return CsmctlConfig {} , fmt .Errorf ("failed to provider name match regex: %w" , err )
7071 }
7172 if ! match {
72- return nil , fmt .Errorf ("invalid provider type: %q" , cs .Config .Provider .Type )
73+ return CsmctlConfig {} , fmt .Errorf ("invalid provider type: %q" , cs .Config .Provider .Type )
7374 }
7475
7576 if cs .Config .ClusterStackName == "" {
76- return nil , fmt .Errorf ("cluster stack name must not be empty" )
77+ return CsmctlConfig {} , fmt .Errorf ("cluster stack name must not be empty" )
7778 }
7879
7980 // Validate kubernetes version
8081 matched , err := regexp .MatchString (`^v\d+\.\d+\.\d+$` , cs .Config .KubernetesVersion )
8182 if err != nil {
82- return nil , fmt .Errorf ("failed to kubernetes match regex: %w" , err )
83+ return CsmctlConfig {} , fmt .Errorf ("failed to kubernetes match regex: %w" , err )
8384 }
8485 if ! matched {
85- return nil , fmt .Errorf ("invalid kubernetes version: %q" , cs .Config .KubernetesVersion )
86+ return CsmctlConfig {} , fmt .Errorf ("invalid kubernetes version: %q" , cs .Config .KubernetesVersion )
8687 }
8788
8889 return cs , nil
@@ -111,3 +112,22 @@ func (c *CsmctlConfig) ParseKubernetesVersion() (kubernetesversion.KubernetesVer
111112 Minor : minor ,
112113 }, nil
113114}
115+
116+ // GetClusterStackReleaseDirectoryName returns cluster stack release directory.
117+ // e.g. - docker-ferrol-1-27-v1/ .
118+ func GetClusterStackReleaseDirectoryName (metadata * MetaData , config * CsmctlConfig ) (string , error ) {
119+ // Parse the cluster stack version from dot format `v1-alpha.0` to a version way of struct
120+ // and parse the kubernetes version from `v1.27.3` to a major minor way
121+ // and create the release directory at the end.
122+ clusterStackVersion , err := version .New (metadata .Versions .ClusterStack )
123+ if err != nil {
124+ return "" , fmt .Errorf ("failed to parse cluster stack version: %w" , err )
125+ }
126+ kubernetesVerion , err := config .ParseKubernetesVersion ()
127+ if err != nil {
128+ return "" , fmt .Errorf ("failed to parse kubernetes version: %w" , err )
129+ }
130+ clusterStackReleaseDirName := fmt .Sprintf ("%s-%s-%s-%s" , config .Config .Provider .Type , config .Config .ClusterStackName , kubernetesVerion .String (), clusterStackVersion .String ())
131+
132+ return clusterStackReleaseDirName , nil
133+ }
0 commit comments