{"id":30131559,"url":"https://github.com/lyridinc/cluster-api-go-sdk","last_synced_at":"2026-05-18T00:02:27.986Z","repository":{"id":65771215,"uuid":"597165559","full_name":"LyridInc/cluster-api-go-sdk","owner":"LyridInc","description":"Go SDK to automate cluster provisioning using Cluster API","archived":false,"fork":false,"pushed_at":"2025-09-05T16:04:37.000Z","size":349,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":4,"default_branch":"main","last_synced_at":"2026-05-03T14:37:34.284Z","etag":null,"topics":["cluster-api","go","k8s","kubernetes","openstack"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/LyridInc.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-02-03T19:17:32.000Z","updated_at":"2025-09-05T16:04:00.000Z","dependencies_parsed_at":"2023-11-28T02:28:29.099Z","dependency_job_id":"ae484f55-1599-4af9-869f-e36add925668","html_url":"https://github.com/LyridInc/cluster-api-go-sdk","commit_stats":{"total_commits":84,"total_committers":1,"mean_commits":84.0,"dds":0.0,"last_synced_commit":"6ee297d64e968174661fef6fcb5498b46defd627"},"previous_names":[],"tags_count":98,"template":false,"template_full_name":null,"purl":"pkg:github/LyridInc/cluster-api-go-sdk","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LyridInc%2Fcluster-api-go-sdk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LyridInc%2Fcluster-api-go-sdk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LyridInc%2Fcluster-api-go-sdk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LyridInc%2Fcluster-api-go-sdk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/LyridInc","download_url":"https://codeload.github.com/LyridInc/cluster-api-go-sdk/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LyridInc%2Fcluster-api-go-sdk/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33160167,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-17T22:39:12.733Z","status":"ssl_error","status_checked_at":"2026-05-17T22:39:10.741Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cluster-api","go","k8s","kubernetes","openstack"],"created_at":"2025-08-10T19:01:21.025Z","updated_at":"2026-05-18T00:02:22.977Z","avatar_url":"https://github.com/LyridInc.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"## Installation\n```sh\ngo get github.com/LyridInc/cluster-api-go-sdk\n```\n\n## Examples\n\n### Setup OpenStack environment variables\n```go\nyamlByte, _ := os.ReadFile(\"./test/data/clouds.yaml\")\ncloudsYaml := model.CloudsYaml{}\ncloudsYaml.Parse(yamlByte)\nopt := option.OpenstackGenerateClusterOptions{\n  ControlPlaneMachineFlavor: \"SS2.2\",\n  NodeMachineFlavor:         \"SM8.4\",\n  ExternalNetworkId:         \"79241ddc-c51b-4677-a763-f48c60870923\",\n  ImageName:                 \"ubuntu-2004-kube-v1.24.8\",\n  SshKeyName:                \"kube-key\",\n  DnsNameServers:            \"8.8.8.8\",\n  FailureDomain:             \"az-01\",\n  IgnoreVolumeAZ:            true,\n}\ncloudsYaml.SetEnvironment(opt)\n```\n\n### Initialize infrastructure OpenStack\n\n```go\ninfrastructure := \"openstack\"\ncapi := api.NewClusterApiClient(\"\", \"\u003cYOUR KUBECONFIG FILE PATH\u003e\")\n\ncapi.InitInfrastructure(infrastructure)\n```\n\n### Authenticate OpenStack client\n\n```go\ncl := api.OpenstackClient{\n  NetworkEndpoint: os.Getenv(\"OS_NETWORK_ENDPOINT\"),\n  AuthEndpoint:    os.Getenv(\"OS_AUTH_ENDPOINT\"),\n  AuthToken:       os.Getenv(\"OS_TOKEN\"),\n  ProjectId:       os.Getenv(\"OS_PROJECT_ID\"),\n}\n\nerr = cl.Authenticate(api.OpenstackCredential{\n  ApplicationCredentialName:   os.Getenv(\"OS_APPLICATION_CREDENTIAL_NAME\"),\n  ApplicationCredentialId:     os.Getenv(\"OS_APPLICATION_CREDENTIAL_ID\"),\n  ApplicationCredentialSecret: os.Getenv(\"OS_APPLICATION_CREDENTIAL_SECRET\"),\n})\nif err != nil {\n  log.Fatal(\"Openstack authentication error:\", err)\n}\n```\n\n### Generate workload cluster\n```go\nclusterName := \"capi-local-2\"\nclusterOpt := option.GenerateWorkloadClusterOptions{\n  ClusterName:              clusterName,\n  KubernetesVersion:        \"v1.24.8\",\n  WorkerMachineCount:       3,\n  ControlPlaneMachineCount: 1,\n  InfrastructureProvider:   infrastructure,\n  Flavor:                   \"external-cloud-provider\",\n}\nyaml, err = capi.GenerateWorkloadClusterYaml(clusterOpt)\nif err != nil {\n  log.Fatal(\"Generate workload cluster error:\", err)\n}\n\n// update cidr blocks and allow all in cluster traffic to support flannel cni\nyaml, _ = cl.UpdateYamlManifest(yaml, option.ManifestOption{\n  ClusterKindSpecOption: option.ClusterKindSpecOption{\n    CidrBlocks: []string{\"10.244.0.0/16\"},\n  },\n  InfrastructureKindSpecOption: option.InfrastructureKindSpecOption{\n    AllowAllInClusterTraffic: true,\n  },\n})\n\nif err := capi.ApplyYaml(yaml); err != nil {\n  log.Fatal(err)\n}\n```\n\n### Get workload cluster kubeconfig\n```go\nconf, err := capi.GetWorkloadClusterKubeconfig(clusterName)\nif err == nil {\n  if err := os.WriteFile(fmt.Sprintf(\"./%s.kubeconfig\", clusterName), []byte(*conf), 0644); err != nil {\n    log.Fatal(\"Write kubeconfig error:\", err)\n  }\n}\n```\n\n### Create secret\n```go\ncloudConf := os.Getenv(\"OPENSTACK_CLOUD_PROVIDER_CONF\")\nif cloudConf == \"\" {\n  log.Fatal(\"Error reading cloud conf: OPENSTACK_CLOUD_PROVIDER_CONF is not set\")\n}\n\nif err := capi.SetKubernetesClientset(\"\u003cYOUR WORKLOAD CLUSTER KUBECONFIG FILE PATH\u003e\"); err != nil {\n  log.Fatal(\"Error set kubeconfig:\", error.Error(err))\n}\nsecret := v1.Secret{\n  TypeMeta: metav1.TypeMeta{\n    APIVersion: v1.SchemeGroupVersion.String(),\n    Kind:       \"Secret\",\n  },\n  ObjectMeta: metav1.ObjectMeta{\n    Name:      \"cloud-config\",\n    Namespace: \"kube-system\",\n  },\n  Data: map[string][]byte{\n    \"cloud.conf\": []byte(cloudConf),\n  },\n}\n\nif _, err := capi.CreateSecret(secret); err != nil {\n  fmt.Println(\"Error create secret:\", error.Error(err))\n  fmt.Println(\"Trying again..\")\n  time.Sleep(3 * time.Second)\n} else {\n  break\n}\n```\n\n### Installing Flannel CNI\n```go\nyaml, err = model.ReadYamlFromUrl(option.FLANNEL_MANIFEST_URL)\nif err != nil {\n  log.Fatal(error.Error(err))\n}\n\nif err := capi.ApplyYaml(yaml); err != nil {\n  log.Fatal(\"Error apply flannel cni yaml:\", error.Error(err))\n}\n\nsecretName := fmt.Sprintf(\"%s-csi-cloud-secret\", clusterName)\n\nfor _, url := range option.OPENSTACK_CLOUD_CONTROLLER_MANIFEST_URLS {\n  yaml, err := model.ReadYamlFromUrl(url)\n  if err != nil {\n    log.Fatal(error.Error(err))\n  }\n\n  if err := capi.ApplyYaml(yaml); err != nil {\n    log.Fatal(\"Error apply yaml:\", url, \" - \", error.Error(err))\n  }\n}\n```\n\n### Installing Cinder CSI Driver on OpenStack provider cluster\n```go\nyaml, err = model.ReadYamlFromUrl(option.OPENSTACK_CINDER_DRIVER_MANIFEST_URLS[\"secret\"].(string))\nif err != nil {\n  log.Fatal(error.Error(err))\n}\n\ncloudConfB64 := os.Getenv(\"OPENSTACK_CLOUD_PROVIDER_CONF_B64\")\nif cloudConfB64 == \"\" {\n  log.Fatal(\"Error reading cloud conf: OPENSTACK_CLOUD_PROVIDER_CONF_B64 is not set\")\n}\n\nyamlResult, err := cl.UpdateYamlManifest(yaml, option.ManifestOption{\n  SecretKindOption: option.SecretKindOption{\n    Data: map[string]interface{}{\n      \"cloud.conf\": cloudConfB64,\n    },\n    Metadata: map[string]interface{}{\n      \"name\":      secretName,\n      \"namespace\": \"kube-system\",\n    },\n  },\n})\nif err != nil {\n  log.Fatal(\"Update yaml from url error:\", error.Error(err))\n}\n\nif err := capi.ApplyYaml(yamlResult); err != nil {\n  log.Fatal(\"Error create cinder csi secret:\", error.Error(err))\n}\n\npluginUrls := option.OPENSTACK_CINDER_DRIVER_MANIFEST_URLS[\"plugins\"].([]string)\nfor i, url := range pluginUrls {\n  yaml, err := model.ReadYamlFromUrl(url)\n  if err != nil {\n    log.Fatal(error.Error(err))\n  }\n\n  if url == \"https://raw.githubusercontent.com/kubernetes/cloud-provider-openstack/master/manifests/cinder-csi-plugin/cinder-csi-controllerplugin.yaml\" {\n    // deployment\n    yamlResult, err := cl.UpdateYamlManifest(yaml, option.ManifestOption{\n      DeploymentKindOption: option.DeploymentKindOption{\n        VolumeSecretName: secretName,\n      },\n    })\n    if err != nil {\n      log.Fatal(\"Update yaml from url error:\", error.Error(err))\n    }\n\n  } else if url == \"https://raw.githubusercontent.com/kubernetes/cloud-provider-openstack/master/manifests/cinder-csi-plugin/cinder-csi-nodeplugin.yaml\" {\n    // daemonset\n    yamlResult, err := cl.UpdateYamlManifest(yaml, option.ManifestOption{\n      DaemonSetKindOption: option.DaemonSetKindOption{\n        VolumeSecretName: secretName,\n      },\n    })\n    if err != nil {\n      log.Fatal(\"Update yaml from url error:\", error.Error(err))\n    }\n  }\n\n  if err := capi.ApplyYaml(yaml); err != nil {\n    log.Fatal(\"Error apply yaml:\", url, \" - \", error.Error(err))\n  }\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flyridinc%2Fcluster-api-go-sdk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flyridinc%2Fcluster-api-go-sdk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flyridinc%2Fcluster-api-go-sdk/lists"}