Skip to content

Commit

Permalink
Restructure code to have better readability
Browse files Browse the repository at this point in the history
Signed-off-by: Aniruddha Basak <[email protected]>
  • Loading branch information
aniruddha2000 committed Jan 25, 2024
1 parent 6301e5c commit a3bbaca
Show file tree
Hide file tree
Showing 6 changed files with 246 additions and 207 deletions.
40 changes: 29 additions & 11 deletions pkg/clusterstack/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import (
"strings"

"github.com/SovereignCloudStack/cluster-stack-operator/pkg/kubernetesversion"
"github.com/SovereignCloudStack/cluster-stack-operator/pkg/version"
"gopkg.in/yaml.v3"
)

Expand All @@ -44,45 +45,45 @@ type CsmctlConfig struct {
}

// GetCsmctlConfig returns CsmctlConfig.
func GetCsmctlConfig(path string) (*CsmctlConfig, error) {
func GetCsmctlConfig(path string) (CsmctlConfig, error) {
configPath := filepath.Join(path, "csmctl.yaml")
configFileData, err := os.ReadFile(filepath.Clean(configPath))
if err != nil {
return nil, fmt.Errorf("failed to read csmctl config: %w", err)
return CsmctlConfig{}, fmt.Errorf("failed to read csmctl config: %w", err)
}

cs := &CsmctlConfig{}
cs := CsmctlConfig{}
if err := yaml.Unmarshal(configFileData, &cs); err != nil {
return nil, fmt.Errorf("failed to unmarshal csmctl yaml: %w", err)
return CsmctlConfig{}, fmt.Errorf("failed to unmarshal csmctl yaml: %w", err)
}

if cs.Config.Provider.Type == "" {
return nil, fmt.Errorf("provider type must not be empty")
return CsmctlConfig{}, fmt.Errorf("provider type must not be empty")
}

if len(cs.Config.Provider.Type) > 253 {
return nil, fmt.Errorf("provider name must not be greater than 253")
return CsmctlConfig{}, fmt.Errorf("provider name must not be greater than 253")
}

match, err := regexp.MatchString(`^[a-z0-9]([-a-z0-9]*[a-z0-9])?$`, cs.Config.Provider.Type)
if err != nil {
return nil, fmt.Errorf("failed to provider name match regex: %w", err)
return CsmctlConfig{}, fmt.Errorf("failed to provider name match regex: %w", err)
}
if !match {
return nil, fmt.Errorf("invalid provider type: %q", cs.Config.Provider.Type)
return CsmctlConfig{}, fmt.Errorf("invalid provider type: %q", cs.Config.Provider.Type)
}

if cs.Config.ClusterStackName == "" {
return nil, fmt.Errorf("cluster stack name must not be empty")
return CsmctlConfig{}, fmt.Errorf("cluster stack name must not be empty")
}

// Validate kubernetes version
matched, err := regexp.MatchString(`^v\d+\.\d+\.\d+$`, cs.Config.KubernetesVersion)
if err != nil {
return nil, fmt.Errorf("failed to kubernetes match regex: %w", err)
return CsmctlConfig{}, fmt.Errorf("failed to kubernetes match regex: %w", err)
}
if !matched {
return nil, fmt.Errorf("invalid kubernetes version: %q", cs.Config.KubernetesVersion)
return CsmctlConfig{}, fmt.Errorf("invalid kubernetes version: %q", cs.Config.KubernetesVersion)
}

return cs, nil
Expand Down Expand Up @@ -111,3 +112,20 @@ func (c *CsmctlConfig) ParseKubernetesVersion() (kubernetesversion.KubernetesVer
Minor: minor,
}, nil
}

func GetClusterStackReleaseDirectoryName(metadata MetaData, config CsmctlConfig) (string, error) {
// Parse the cluster stack version from dot format `v1-alpha.0` to a version way of struct
// and parse the kubernetes version from `v1.27.3` to a major minor way
// and create the release directory at the end.
clusterStackVersion, err := version.New(metadata.Versions.ClusterStack)
if err != nil {
return "", fmt.Errorf("failed to parse cluster stack version: %w", err)
}
kubernetesVerion, err := config.ParseKubernetesVersion()
if err != nil {
return "", fmt.Errorf("failed to parse kubernetes version: %w", err)
}
clusterStackReleaseDirName := fmt.Sprintf("%s-%s-%s-%s", config.Config.Provider.Type, config.Config.ClusterStackName, kubernetesVerion.String(), clusterStackVersion.String())

return clusterStackReleaseDirName, nil
}
35 changes: 19 additions & 16 deletions pkg/clusterstack/metadata.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,40 +24,43 @@ import (
"gopkg.in/yaml.v3"
)

// MetaData contains information of the metadata.yaml.
type Component struct {
ClusterAddon string `yaml:"clusterAddon"`
NodeImage string `yaml:"nodeImage"`
}

type Versions struct {
ClusterStack string `yaml:"clusterStack"`
Kubernetes string `yaml:"kubernetes"`
Components Component `yaml:"components"`
}

type MetaData struct {
APIVersion string `yaml:"apiVersion"`
Versions struct {
ClusterStack string `yaml:"clusterStack"`
Kubernetes string `yaml:"kubernetes"`
Components struct {
ClusterAddon string `yaml:"clusterAddon"`
NodeImage string `yaml:"nodeImage,omitempty"`
} `yaml:"components"`
} `yaml:"versions"`
APIVersion string `yaml:"apiVersion"`
Versions Versions `yaml:"versions"`
}

// ParseMetaData parse the metadata file.
func ParseMetaData(path string) (*MetaData, error) {
func ParseMetaData(path string) (MetaData, error) {
entries, err := os.ReadDir(path)
if err != nil {
return nil, fmt.Errorf("failed to read metadata directory: %w", err)
return MetaData{}, fmt.Errorf("failed to read metadata directory: %w", err)
}

if len(entries) != 1 {
return nil, fmt.Errorf("ambiguous release found")
return MetaData{}, fmt.Errorf("ambiguous release found")
}

metadataPath := filepath.Join(path, entries[0].Name(), "metadata.yaml")
fileInfo, err := os.ReadFile(filepath.Clean(metadataPath))
if err != nil {
return nil, fmt.Errorf("failed to read metadata file: %w", err)
return MetaData{}, fmt.Errorf("failed to read metadata file: %w", err)
}

metaData := &MetaData{}
metaData := MetaData{}

if err := yaml.Unmarshal(fileInfo, &metaData); err != nil {
return nil, fmt.Errorf("failed to unmarshal metadata yaml: %w", err)
return MetaData{}, fmt.Errorf("failed to unmarshal metadata yaml: %w", err)
}

return metaData, nil
Expand Down
59 changes: 59 additions & 0 deletions pkg/clusterstack/mode.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package clusterstack

import (
"fmt"

"github.com/SovereignCloudStack/csmctl/pkg/hash"
)

func HandleStableMode(kubernetesVersion, gitHubReleasePath string, currentReleaseHash, latestReleaseHash hash.ReleaseHash) (MetaData, error) {
metadata, err := ParseMetaData(gitHubReleasePath)
if err != nil {
return MetaData{}, fmt.Errorf("failed to parse metadata: %w", err)
}

metadata.Versions.ClusterStack, err = BumpVersion(metadata.Versions.ClusterStack)
if err != nil {
return MetaData{}, fmt.Errorf("failed to bump cluster stack: %w", err)
}
fmt.Printf("Bumped ClusterStack Version: %s\n", metadata.Versions.ClusterStack)

if currentReleaseHash.ClusterAddonDir != latestReleaseHash.ClusterAddonDir || currentReleaseHash.ClusterAddonValues != latestReleaseHash.ClusterAddonValues {
metadata.Versions.Components.ClusterAddon, err = BumpVersion(metadata.Versions.Components.ClusterAddon)
if err != nil {
return MetaData{}, fmt.Errorf("failed to bump cluster addon: %w", err)
}
fmt.Printf("Bumped ClusterAddon Version: %s\n", metadata.Versions.Components.ClusterAddon)
} else {
fmt.Printf("ClusterAddon Version unchanged: %s\n", metadata.Versions.Components.ClusterAddon)
}

if currentReleaseHash.NodeImageDir != latestReleaseHash.NodeImageDir {
metadata.Versions.Components.NodeImage, err = BumpVersion(metadata.Versions.Components.NodeImage)
if err != nil {
return MetaData{}, fmt.Errorf("failed to bump node image: %w", err)
}
fmt.Printf("Bumped NodeImage Version: %s\n", metadata.Versions.Components.NodeImage)
} else {
fmt.Printf("NodeImage Version unchanged: %s\n", metadata.Versions.Components.NodeImage)
}

return metadata, nil
}

func HandleHashMode(currentRelease hash.ReleaseHash, kubernetesVersion string) MetaData {
clusterStackHash := currentRelease.GetClusterStackHash()
clusterStackHash = fmt.Sprintf("v0-sha.%s", clusterStackHash)

return MetaData{
APIVersion: "metadata.clusterstack.x-k8s.io/v1alpha1",
Versions: Versions{
Kubernetes: kubernetesVersion,
ClusterStack: clusterStackHash,
Components: Component{
ClusterAddon: clusterStackHash,
NodeImage: clusterStackHash,
},
},
}
}
Loading

0 comments on commit a3bbaca

Please sign in to comment.