Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ require (
github.com/terraform-providers/terraform-provider-azurestack v0.10.0
github.com/terraform-providers/terraform-provider-ignition/v2 v2.1.0
github.com/terraform-providers/terraform-provider-local v1.4.0
github.com/terraform-providers/terraform-provider-nutanix v1.1.0
github.com/terraform-providers/terraform-provider-random v1.3.2-0.20190925210718-83518d96ae4f
github.com/ulikunitz/xz v0.5.8
github.com/vincent-petithory/dataurl v0.0.0-20191104211930-d1553a71de50
Expand All @@ -105,6 +106,8 @@ require (
sigs.k8s.io/controller-tools v0.7.0
)

require github.com/kdomanski/iso9660 v0.2.1

require (
cloud.google.com/go/bigtable v1.5.0 // indirect
cloud.google.com/go/storage v1.11.0 // indirect
Expand Down Expand Up @@ -397,6 +400,7 @@ replace (
github.com/terraform-providers/terraform-provider-azurestack => github.com/openshift/terraform-provider-azurestack v0.10.0-openshift // Use OpenShift fork
github.com/terraform-providers/terraform-provider-google v1.20.1-0.20200623174414-27107f2ee160 => github.com/openshift/terraform-providers-terraform-provider-google v1.20.1-0.20211201190933-7b79c6d1afc8 // Pin to 3.27.0-openshift
github.com/terraform-providers/terraform-provider-ignition/v2 => github.com/community-terraform-providers/terraform-provider-ignition/v2 v2.1.0
github.com/terraform-providers/terraform-provider-nutanix => github.com/nutanix/terraform-provider-nutanix v1.2.2-0.20211029075448-e21f85ac2cf7
k8s.io/client-go => k8s.io/client-go v0.22.0
k8s.io/kubectl => k8s.io/kubectl v0.21.0-rc.0
sigs.k8s.io/cluster-api-provider-aws => github.com/openshift/cluster-api-provider-aws v0.2.1-0.20210121023454-5ffc5f422a80
Expand Down
4 changes: 4 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -1218,6 +1218,8 @@ github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0Lh
github.com/katbyte/terrafmt v0.2.1-0.20200303174203-e6a3e82cb21b/go.mod h1:WRq5tDmK04tcYbEr400zAUWtOK0jix54e8YeHP3IoQg=
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
github.com/kdomanski/iso9660 v0.2.1 h1:IepyfCeEqx77rZeOM4XZgWB4XJWEF7Jp+1ehMTrSElg=
github.com/kdomanski/iso9660 v0.2.1/go.mod h1:LY50s7BlG+ES6V99oxYGd0ub9giLrKdHZb3LLOweBj0=
github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd h1:Coekwdh0v2wtGp9Gmz1Ze3eVRAWJMLokvN3QjdzCHLY=
github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
github.com/keybase/go-crypto v0.0.0-20161004153544-93f5b35093ba/go.mod h1:ghbZscTyKdM07+Fw3KSi0hcJm+AlEUWj8QLlPtijN/M=
Expand Down Expand Up @@ -1457,6 +1459,8 @@ github.com/nishanths/exhaustive v0.0.0-20200708172631-8866003e3856/go.mod h1:wBE
github.com/nishanths/exhaustive v0.0.0-20200811152831-6cf413ae40e0/go.mod h1:wBEpHwM2OdmeNpdCvRPUlkEbBuaFmcK4Wv8Q7FuGW3c=
github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d h1:VhgPp6v9qf9Agr/56bj7Y/xa04UccTW04VP0Qed4vnQ=
github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d/go.mod h1:YUTz3bUH2ZwIWBy3CJBeOBEugqcmXREj14T+iG/4k4U=
github.com/nutanix/terraform-provider-nutanix v1.2.2-0.20211029075448-e21f85ac2cf7 h1:XSW7lfLeXiwu1wT8qchccK76lyco9MdSuch5RYjeaZA=
github.com/nutanix/terraform-provider-nutanix v1.2.2-0.20211029075448-e21f85ac2cf7/go.mod h1:XNd4Ph1C07UCzVdGq9IJ98nsRLq4gQwmiZ2fJo6Vhlg=
github.com/nwaples/rardecode v1.0.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0=
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
Expand Down
5 changes: 5 additions & 0 deletions pkg/types/clustermetadata.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"github.com/openshift/installer/pkg/types/gcp"
"github.com/openshift/installer/pkg/types/ibmcloud"
"github.com/openshift/installer/pkg/types/libvirt"
"github.com/openshift/installer/pkg/types/nutanix"
"github.com/openshift/installer/pkg/types/openstack"
"github.com/openshift/installer/pkg/types/ovirt"
"github.com/openshift/installer/pkg/types/vsphere"
Expand Down Expand Up @@ -37,6 +38,7 @@ type ClusterPlatformMetadata struct {
BareMetal *baremetal.Metadata `json:"baremetal,omitempty"`
Ovirt *ovirt.Metadata `json:"ovirt,omitempty"`
VSphere *vsphere.Metadata `json:"vsphere,omitempty"`
Nutanix *nutanix.Metadata `json:"nutanix,omitempty"`
}

// Platform returns a string representation of the platform
Expand Down Expand Up @@ -76,5 +78,8 @@ func (cpm *ClusterPlatformMetadata) Platform() string {
if cpm.VSphere != nil {
return vsphere.Name
}
if cpm.Nutanix != nil {
return nutanix.Name
}
return ""
}
4 changes: 4 additions & 0 deletions pkg/types/defaults/installconfig.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
ibmclouddefaults "github.com/openshift/installer/pkg/types/ibmcloud/defaults"
libvirtdefaults "github.com/openshift/installer/pkg/types/libvirt/defaults"
nonedefaults "github.com/openshift/installer/pkg/types/none/defaults"
nutanixdefaults "github.com/openshift/installer/pkg/types/nutanix/defaults"
openstackdefaults "github.com/openshift/installer/pkg/types/openstack/defaults"
ovirtdefaults "github.com/openshift/installer/pkg/types/ovirt/defaults"
vspheredefaults "github.com/openshift/installer/pkg/types/vsphere/defaults"
Expand Down Expand Up @@ -107,5 +108,8 @@ func SetInstallConfigDefaults(c *types.InstallConfig) {
}
case c.Platform.None != nil:
nonedefaults.SetPlatformDefaults(c.Platform.None)
case c.Platform.Nutanix != nil:
nutanixdefaults.SetPlatformDefaults(c.Platform.Nutanix, c)
}

}
8 changes: 8 additions & 0 deletions pkg/types/installconfig.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
"github.com/openshift/installer/pkg/types/ibmcloud"
"github.com/openshift/installer/pkg/types/libvirt"
"github.com/openshift/installer/pkg/types/none"
"github.com/openshift/installer/pkg/types/nutanix"
"github.com/openshift/installer/pkg/types/openstack"
"github.com/openshift/installer/pkg/types/ovirt"
"github.com/openshift/installer/pkg/types/vsphere"
Expand All @@ -37,6 +38,7 @@ var (
azure.Name,
gcp.Name,
ibmcloud.Name,
nutanix.Name,
openstack.Name,
ovirt.Name,
vsphere.Name,
Expand Down Expand Up @@ -212,6 +214,10 @@ type Platform struct {
// Ovirt is the configuration used when installing on oVirt.
// +optional
Ovirt *ovirt.Platform `json:"ovirt,omitempty"`

// Nutanix is the configuration used when installing on Nutanix.
// +optional
Nutanix *nutanix.Platform `json:"nutanix,omitempty"`
}

// Name returns a string representation of the platform (e.g. "aws" if
Expand Down Expand Up @@ -243,6 +249,8 @@ func (p *Platform) Name() string {
return vsphere.Name
case p.Ovirt != nil:
return ovirt.Name
case p.Nutanix != nil:
return nutanix.Name
default:
return ""
}
Expand Down
6 changes: 6 additions & 0 deletions pkg/types/machinepools.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"github.com/openshift/installer/pkg/types/gcp"
"github.com/openshift/installer/pkg/types/ibmcloud"
"github.com/openshift/installer/pkg/types/libvirt"
"github.com/openshift/installer/pkg/types/nutanix"
"github.com/openshift/installer/pkg/types/openstack"
"github.com/openshift/installer/pkg/types/ovirt"
"github.com/openshift/installer/pkg/types/vsphere"
Expand Down Expand Up @@ -100,6 +101,9 @@ type MachinePoolPlatform struct {

// Ovirt is the configuration used when installing on oVirt.
Ovirt *ovirt.MachinePool `json:"ovirt,omitempty"`

// Nutanix is the configuration used when installing on Nutanix.
Nutanix *nutanix.MachinePool `json:"nutanix,omitempty"`
}

// Name returns a string representation of the platform (e.g. "aws" if
Expand Down Expand Up @@ -129,6 +133,8 @@ func (p *MachinePoolPlatform) Name() string {
return vsphere.Name
case p.Ovirt != nil:
return ovirt.Name
case p.Nutanix != nil:
return nutanix.Name
default:
return ""
}
Expand Down
5 changes: 5 additions & 0 deletions pkg/types/nutanix/OWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# See the OWNERS docs: https://git.k8s.io/community/contributors/guide/owners.md
# This file just uses aliases defined in OWNERS_ALIASES.

approvers:
- nutanix-approvers
35 changes: 35 additions & 0 deletions pkg/types/nutanix/client.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package nutanix

import (
"context"
"fmt"
"time"

nutanixClient "github.com/terraform-providers/terraform-provider-nutanix/client"
nutanixClientV3 "github.com/terraform-providers/terraform-provider-nutanix/client/v3"
"k8s.io/klog"
)


func CreateNutanixClient(ctx context.Context, prismCentral, port, username, password string, insecure bool) (*nutanixClientV3.Client, error) {
ctx, cancel := context.WithTimeout(ctx, 60*time.Second)
defer cancel()

cred := nutanixClient.Credentials{
URL: fmt.Sprintf("%s:%s", prismCentral, port),
Username: username,
Password: password,
Port: port,
Endpoint: prismCentral,
Insecure: insecure,
}

cli, err := nutanixClientV3.NewV3Client(cred)
if err != nil {
klog.Errorf("Failed to create the nutanix client. error: %v", err)
return nil, err
}

return cli, nil

}
10 changes: 10 additions & 0 deletions pkg/types/nutanix/defaults/platform.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package defaults

import (
"github.com/openshift/installer/pkg/types"
"github.com/openshift/installer/pkg/types/nutanix"
)


// SetPlatformDefaults sets the defaults for the platform.
func SetPlatformDefaults(p *nutanix.Platform, installConfig *types.InstallConfig) {}
42 changes: 42 additions & 0 deletions pkg/types/nutanix/defaults/platform_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package defaults

import (
"testing"

"github.com/stretchr/testify/assert"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

"github.com/openshift/installer/pkg/types"
"github.com/openshift/installer/pkg/types/nutanix"
)

const testClusterName = "test-cluster"

func defaultPlatform() *nutanix.Platform {
return &nutanix.Platform{}
}

func TestSetPlatformDefaults(t *testing.T) {
cases := []struct {
name string
platform *nutanix.Platform
expected *nutanix.Platform
}{
{
name: "empty",
platform: &nutanix.Platform{},
expected: defaultPlatform(),
},
}
for _, tc := range cases {
t.Run(tc.name, func(t *testing.T) {
ic := &types.InstallConfig{
ObjectMeta: metav1.ObjectMeta{
Name: testClusterName,
},
}
SetPlatformDefaults(tc.platform, ic)
assert.Equal(t, tc.expected, tc.platform, "unexpected platform")
})
}
}
5 changes: 5 additions & 0 deletions pkg/types/nutanix/doc.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
// Package nutanix contains Nutanix-specific structures for installer
// configuration and management.
package nutanix

const Name = "nutanix"
137 changes: 137 additions & 0 deletions pkg/types/nutanix/helpers.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
package nutanix

import (
"encoding/json"
"fmt"
"os"
"strings"
"time"

"github.com/google/uuid"
"github.com/kdomanski/iso9660"
"github.com/pkg/errors"
nutanixClientV3 "github.com/terraform-providers/terraform-provider-nutanix/client/v3"
"github.com/terraform-providers/terraform-provider-nutanix/utils"
)

const (
diskLabel = "config-2"
isoFile = "bootstrap-ign.iso"
metadataFilePath = "openstack/latest/meta_data.json"
userDataFilePath = "openstack/latest/user_data"
sleepTime = 10 * time.Second
timeout = 5 * time.Minute
)

type MetadataCloudInit struct {
UUID string `json:"uuid"`
}

func bootISOImageName(infraID string) string {
return fmt.Sprintf("%s-%s", infraID, isoFile)
}

func createBootstrapISO(infraID, userData string) (string, error) {
id := uuid.New()
metaObj := &MetadataCloudInit{
UUID: id.String(),
}
fullISOFile := bootISOImageName(infraID)
metadata, err := json.Marshal(metaObj)
if err != nil {
return "", errors.Wrap(err, fmt.Sprintf("failed marshal metadata struct to json"))
}
writer, err := iso9660.NewWriter()
if err != nil {
return "", errors.Wrap(err, fmt.Sprintf("failed to create writer: %s", err))
}
defer writer.Cleanup()

userDataReader := strings.NewReader(userData)
err = writer.AddFile(userDataReader, userDataFilePath)
if err != nil {
return "", errors.Wrap(err, fmt.Sprintf("failed to add file: %s", err))
}

metadataReader := strings.NewReader(string(metadata))
err = writer.AddFile(metadataReader, metadataFilePath)
if err != nil {
return "", errors.Wrap(err, fmt.Sprintf("failed to add file: %s", err))
}

outputFile, err := os.OpenFile(fullISOFile, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0644)
if err != nil {
return "", errors.Wrap(err, fmt.Sprintf("failed to create file: %s", err))
}

err = writer.WriteTo(outputFile, diskLabel)
if err != nil {
return "", errors.Wrap(err, fmt.Sprintf("failed to write ISO image: %s", err))
}

err = outputFile.Close()
if err != nil {
return "", errors.Wrap(err, fmt.Sprintf("failed to close output file: %s", err))
}
return fullISOFile, nil
}

func waitForTasks(clientV3 nutanixClientV3.Service, taskUUIDs []string) error {
for _, t := range taskUUIDs {
err := waitForTask(clientV3, t)
if err != nil {
return err
}
}
return nil
}

func waitForTask(clientV3 nutanixClientV3.Service, taskUUID string) error {
finished := false
var err error
for start := time.Now(); time.Since(start) < timeout; {
finished, err = isTaskFinished(clientV3, taskUUID)
if err != nil {
return err
}
if finished {
break
}
time.Sleep(sleepTime)
}
if !finished {
return errors.Errorf("timeout while waiting for task UUID: %s", taskUUID)
}

return nil
}

func isTaskFinished(clientV3 nutanixClientV3.Service, taskUUID string) (bool, error) {
isFinished := map[string]bool{
"QUEUED": false,
"RUNNING": false,
"SUCCEEDED": true,
}
status, err := getTaskStatus(clientV3, taskUUID)
if err != nil {
return false, err
}
if val, ok := isFinished[status]; ok {
return val, nil
}
return false, errors.Errorf("Retrieved unexpected task status: %s", status)

}

func getTaskStatus(clientV3 nutanixClientV3.Service, taskUUID string) (string, error) {
v, err := clientV3.GetTask(taskUUID)

if err != nil {
return "", err
}

if *v.Status == "INVALID_UUID" || *v.Status == "FAILED" {
return *v.Status, errors.Errorf("error_detail: %s, progress_message: %s", utils.StringValue(v.ErrorDetail), utils.StringValue(v.ProgressMessage))
}
return *v.Status, nil
}
Loading