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 26, 2024
1 parent 6301e5c commit 6b851da
Show file tree
Hide file tree
Showing 6 changed files with 251 additions and 204 deletions.
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ require (
golang.org/x/mod v0.14.0
golang.org/x/oauth2 v0.16.0
gopkg.in/src-d/go-git.v4 v4.13.1
gopkg.in/yaml.v2 v2.4.0
gopkg.in/yaml.v3 v3.0.1
helm.sh/helm/v3 v3.13.3
)
Expand Down Expand Up @@ -134,7 +135,6 @@ require (
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/src-d/go-billy.v4 v4.3.2 // indirect
gopkg.in/warnings.v0 v0.1.2 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
k8s.io/api v0.28.4 // indirect
k8s.io/apiextensions-apiserver v0.28.4 // indirect
k8s.io/apimachinery v0.28.4 // indirect
Expand Down
42 changes: 31 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,22 @@ func (c *CsmctlConfig) ParseKubernetesVersion() (kubernetesversion.KubernetesVer
Minor: minor,
}, nil
}

// GetClusterStackReleaseDirectoryName returns cluster stack release directory.
// e.g. - docker-ferrol-1-27-v1/ .
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
}
38 changes: 22 additions & 16 deletions pkg/clusterstack/metadata.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,40 +24,46 @@ import (
"gopkg.in/yaml.v3"
)

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

// Versions contains version information.
type Versions struct {
ClusterStack string `yaml:"clusterStack"`
Kubernetes string `yaml:"kubernetes"`
Components Component `yaml:"components"`
}

// MetaData contains metadata.
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
61 changes: 61 additions & 0 deletions pkg/clusterstack/mode.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package clusterstack

import (
"fmt"

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

// HandleStableMode returns metadata for the stable mode.
func HandleStableMode(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
}

// HandleHashMode returns metadata of Hash mode.
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 6b851da

Please sign in to comment.