Skip to content

Commit

Permalink
metakube_k8s_version data source
Browse files Browse the repository at this point in the history
  • Loading branch information
furkhat committed May 27, 2021
1 parent b900b83 commit d1f4b42
Show file tree
Hide file tree
Showing 12 changed files with 168 additions and 23 deletions.
38 changes: 38 additions & 0 deletions docs/data-sources/k8s_version.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
---
page_title: "MetaKube: metakube_k8s_version"
---

# metakube_k8s_version

Get the latest supported kubernetes version matching `major` & `minor`.

## Example Usage

Get the latest supported patch of Kubernetes v1.21.x:

```hcl
data "metakube_k8s_version" "example" {
major = "1"
minor = "21"
}
resource "metakube_cluster" "foo" {
# ...
spec {
version = data.metakube_k8s_version.example.version
# ...
}
# ...
}
```
## Argument Reference

The following arguments are supported:

* `major` - (Optional) Major version, defaults to the latest available.
* `minor` - (Optional) Minor version, cannot be specified without `major`, defaults to the latest available.

## Attributes Reference

The only attribute exported is:
* `version`: The latest Kubernetes version supported by MetaKube matching `major` and `minor`.
8 changes: 6 additions & 2 deletions examples/aws/main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,17 @@ provider "metakube" {
resource "metakube_project" "example_project" {
name = var.project_name
}
data "metakube_k8s_version" "cluster" {
major = "1"
minor = var.k8s_minor_version
}
resource "metakube_cluster" "example_cluster" {
name = var.cluster_name
dc_name = "syseleven-aws-eu-central-1a"
project_id = metakube_project.example_project.id
spec {
enable_ssh_agent = true
version = var.k8s_version
version = data.metakube_k8s_version.cluster.version
cloud {
aws {
access_key_id = var.aws_access_key_id
Expand Down Expand Up @@ -48,7 +52,7 @@ resource "metakube_node_deployment" "example_node" {
}
}
versions {
kubelet = var.k8s_version
kubelet = data.metakube_k8s_version.cluster.version
}
}
}
Expand Down
6 changes: 3 additions & 3 deletions examples/aws/variables.tf
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ variable "cluster_name" {
type = string
}

variable "k8s_version" {
description = "The Kubernetes version"
variable "k8s_minor_version" {
description = "The minor part of Kubernetes version, eg 21 for v1.21.2"
type = string
}

Expand All @@ -26,4 +26,4 @@ variable "aws_secret_access_key" {
variable "aws_subnet_id" {
description = "AWS Subnet ID"
type = string
}
}
8 changes: 6 additions & 2 deletions examples/azure/main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,17 @@ provider "metakube" {
resource "metakube_project" "example_project" {
name = var.project_name
}
data "metakube_k8s_version" "cluster" {
major = "1"
minor = var.k8s_minor_version
}
resource "metakube_cluster" "example_cluster" {
name = var.cluster_name
dc_name = "syseleven-azure-eastus"
project_id = metakube_project.example_project.id
spec {
enable_ssh_agent = true
version = var.k8s_version
version = data.metakube_k8s_version.cluster.version
cloud {
azure {
client_id = var.azure_client_id
Expand Down Expand Up @@ -44,7 +48,7 @@ resource "metakube_node_deployment" "example_node" {
}
}
versions {
kubelet = var.k8s_version
kubelet = data.metakube_k8s_version.cluster.version
}
}
}
Expand Down
6 changes: 3 additions & 3 deletions examples/azure/variables.tf
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ variable "cluster_name" {
type = string
}

variable "k8s_version" {
description = "The Kubernetes version"
variable "k8s_minor_version" {
description = "The minor part of Kubernetes version, eg 21 for v1.21.2"
type = string
}

Expand All @@ -31,4 +31,4 @@ variable "azure_tenant_id" {
variable "azure_client_secret" {
description = "Azure Client Secret"
type = string
}
}
10 changes: 8 additions & 2 deletions examples/openstack/advanced/main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -128,13 +128,19 @@ resource "metakube_project" "project" {
data "local_file" "public_sshkey" {
filename = pathexpand(var.public_sshkey_file)
}

resource "metakube_sshkey" "local" {
project_id = metakube_project.project.id

name = "local SSH key"
public_key = data.local_file.public_sshkey.content
}

data "metakube_k8s_version" "cluster" {
major = "1"
minor = var.k8s_minor_version
}

resource "metakube_cluster" "cluster" {
name = var.cluster_name
dc_name = var.dc_name
Expand All @@ -153,7 +159,7 @@ resource "metakube_cluster" "cluster" {

spec {
enable_ssh_agent = true
version = var.k8s_version
version = data.metakube_k8s_version.cluster.version
cloud {
openstack {
tenant = var.tenant
Expand Down Expand Up @@ -218,7 +224,7 @@ resource "metakube_node_deployment" "acctest_nd" {
}
}
versions {
kubelet = var.k8s_version
kubelet = data.metakube_k8s_version.cluster.version
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions examples/openstack/advanced/variables.tf
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,8 @@ variable "cluster_domain" {
default = "cluster.local"
}

variable k8s_version {
description = "Kubernetes version"
variable k8s_minor_version {
description = "The minor part of Kubernetes version, eg 21 for v1.21.2"
type = string
}

Expand Down
15 changes: 11 additions & 4 deletions examples/openstack/basic/main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ terraform {
}
}

// You can download and source "OpenStack RC File v3" for your account at https://cloud.syseleven.de or configure it here.
// You can download and source "OpenStack RC File v3" for your account at https://cloud.syseleven.de and source it or configure provider manually here.
// provider "openstack" {
// auth_url = "https://keystone.cloud.syseleven.net:5000/v3"
//
Expand All @@ -32,7 +32,9 @@ data "openstack_images_image_v2" "image" {
}
}

provider "metakube" {}
provider "metakube" {
host = "https://dev.metakube.de"
}
resource "metakube_project" "project" {
name = var.project_name
}
Expand All @@ -48,6 +50,11 @@ resource "metakube_sshkey" "local" {
public_key = data.local_file.public_sshkey.content
}

data "metakube_k8s_version" "cluster" {
major = "1"
minor = var.k8s_minor_version
}

resource "metakube_cluster" "cluster" {
name = var.cluster_name
dc_name = var.dc_name
Expand All @@ -56,7 +63,7 @@ resource "metakube_cluster" "cluster" {

spec {
enable_ssh_agent = true
version = var.k8s_version
version = data.metakube_k8s_version.cluster.version
cloud {
openstack {
floating_ip_pool = var.floating_ip_pool
Expand Down Expand Up @@ -94,7 +101,7 @@ resource "metakube_node_deployment" "node_deployment" {
}
}
versions {
kubelet = var.k8s_version
kubelet = data.metakube_k8s_version.cluster.version
}
}
}
Expand Down
5 changes: 2 additions & 3 deletions examples/openstack/basic/variables.tf
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ variable "cluster_name" {
type = string
}

variable "k8s_version" {
description = "Kubernetes version"
variable "k8s_minor_version" {
description = "The minor part of Kubernetes version, eg 21 for v1.21.2"
type = string
}

Expand Down Expand Up @@ -71,4 +71,3 @@ variable "use_floating_ip" {
default = true
}

variable "" {}
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,5 @@ require (
github.com/mitchellh/go-homedir v1.1.0
github.com/syseleven/go-metakube v0.0.0-20210416091829-b6a6fb1490a6
go.uber.org/zap v1.16.0
golang.org/x/mod v0.3.0
)
84 changes: 84 additions & 0 deletions metakube/datasource_metakube_k8s_version.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
package metakube

import (
"context"
"golang.org/x/mod/semver"
"strings"

"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"

"github.com/syseleven/go-metakube/client/versions"
)

func dataSourceMetakubeK8sClusterVersion() *schema.Resource {
return &schema.Resource{
ReadContext: dataSourceMetakubeK8sClusterVersionRead,
Schema: map[string]*schema.Schema{
"major": {
Type: schema.TypeString,
Optional: true,
Description: "Kubernetes cluster major version",
},
"minor": {
Type: schema.TypeString,
Optional: true,
RequiredWith: []string{"major"},
Description: "Kubernetes cluster minor version",
},
"version": {
Type: schema.TypeString,
Computed: true,
Description: "The latest version of kubernetes cluster that satisfies specification and supported by MetaKube",
},
},
}
}

func dataSourceMetakubeK8sClusterVersionRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
k := meta.(*metakubeProviderMeta)

partialVersionSpec := ""
if v, ok := d.GetOk("major"); ok {
partialVersionSpec = v.(string)
}
if v, ok := d.GetOk("minor"); ok {
partialVersionSpec += "." + v.(string)
}

p := versions.NewGetMasterVersionsParams().WithContext(ctx)
r, err := k.client.Versions.GetMasterVersions(p, k.auth)
if err != nil {
return diag.Errorf("%s", stringifyResponseError(err))
}

var all []string
for _, item := range r.Payload {
if item != nil {
all = append(all, item.Version.(string))
}
}

var available []string
for _, v := range all {
if strings.Index(v, partialVersionSpec) == 0 {
available = append(available, v)
}
}

if len(available) == 0 {
return diag.Errorf("found following versions but did not match specification: %s", strings.Join(all, " "))
}

latest := available[0]
for _, v := range available {
if semver.Compare("v"+v, "v"+latest) > 0 {
latest = v
}
}

d.SetId(latest)
d.Set("version", latest)

return nil
}
6 changes: 4 additions & 2 deletions metakube/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,6 @@ import (
const (
// wait this time before starting resource checks
requestDelay = time.Second
// smallest time to wait before refreshes
retryTimeout = time.Second
)

type metakubeProviderMeta struct {
Expand Down Expand Up @@ -87,6 +85,10 @@ func Provider() *schema.Provider {
"metakube_service_account": metakubeResourceServiceAccount(),
"metakube_service_account_token": metakubeResourceServiceAccountToken(),
},

DataSourcesMap: map[string]*schema.Resource{
"metakube_k8s_version": dataSourceMetakubeK8sClusterVersion(),
},
}

// copying stderr because of https://github.com/hashicorp/go-plugin/issues/93
Expand Down

0 comments on commit d1f4b42

Please sign in to comment.