Skip to content
Merged
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
10 changes: 9 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
@@ -1,21 +1,29 @@
module github.com/openshift-metal3/terraform-provider-ironic

go 1.12
go 1.13

require (
github.com/apparentlymart/go-dump v0.0.0-20190214190832-042adf3cf4a0 // indirect
github.com/aws/aws-sdk-go v1.25.3 // indirect
github.com/coreos/go-semver v0.3.0 // indirect
github.com/coreos/go-systemd v0.0.0-00010101000000-000000000000 // indirect
github.com/coreos/ignition v0.35.0 // indirect
github.com/google/go-cmp v0.3.1 // indirect
github.com/gophercloud/gophercloud v0.0.0-20190509032623-7892efa714f1
github.com/gophercloud/utils v0.0.0-20190313033024-0bcc8e728cb5
github.com/hashicorp/go-retryablehttp v0.6.4
github.com/hashicorp/go-version v1.2.0
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/hashicorp/hil v0.0.0-20190212132231-97b3a9cdfa93 // indirect
github.com/hashicorp/terraform-plugin-sdk v1.0.0
github.com/mattn/go-colorable v0.1.1 // indirect
github.com/mattn/go-isatty v0.0.7 // indirect
github.com/ulikunitz/xz v0.5.6 // indirect
github.com/vincent-petithory/dataurl v0.0.0-20191104211930-d1553a71de50 // indirect
github.com/vmihailenco/msgpack v4.0.4+incompatible // indirect
golang.org/x/lint v0.0.0-20200302205851-738671d3881b // indirect
golang.org/x/net v0.0.0-20191009170851-d66e71096ffb // indirect
golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa // indirect
)

replace github.com/coreos/go-systemd => github.com/coreos/go-systemd/v22 v22.0.0
15 changes: 15 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kB
github.com/bsm/go-vlq v0.0.0-20150828105119-ec6e8d4f5f4e/go.mod h1:N+BjUcTjSxc2mtRGSCPsat1kze3CUtvJN3/jTXlp29k=
github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk=
github.com/coreos/ignition v0.35.0/go.mod h1:WJQapxzEn9DE0ryxsGvm8QnBajm/XsS/PkrDqSpz+bA=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
Expand All @@ -44,6 +47,7 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68=
github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
Expand Down Expand Up @@ -97,6 +101,8 @@ github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uP
github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
github.com/hashicorp/go-plugin v1.0.1 h1:4OtAfUGbnKC6yS48p0CtMX2oFYtzFZVv6rok3cRWgnE=
github.com/hashicorp/go-plugin v1.0.1/go.mod h1:++UyYGoz3o5w9ZzAdZxtQKrWWP+iqPBn3cQptSMzBuY=
github.com/hashicorp/go-retryablehttp v0.6.4 h1:BbgctKO892xEyOXnGiaAwIoSq1QZ/SS4AhjoAh9DnfY=
github.com/hashicorp/go-retryablehttp v0.6.4/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY=
github.com/hashicorp/go-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo=
github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I=
github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE=
Expand Down Expand Up @@ -195,6 +201,7 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV
github.com/ulikunitz/xz v0.5.5/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8=
github.com/ulikunitz/xz v0.5.6 h1:jGHAfXawEGZQ3blwU5wnWKQJvAraT7Ftq9EXjnXYgt8=
github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8=
github.com/vincent-petithory/dataurl v0.0.0-20191104211930-d1553a71de50/go.mod h1:FHafX5vmDzyP+1CQATJn7WFKc9CvnvxyvZy6I1MrG/U=
github.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk=
github.com/vmihailenco/msgpack v4.0.4+incompatible h1:dSLoQfGFAo3F6OoNhwUmLwVgaUXK79GlxNBwueZn0xI=
github.com/vmihailenco/msgpack v4.0.4+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk=
Expand All @@ -213,6 +220,8 @@ golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8U
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586 h1:7KByu05hhLed2MO29w7p1XfZvZ13m8mub3shuVftRs0=
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
Expand All @@ -221,7 +230,10 @@ golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvx
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k=
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180811021610-c39426892332/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
Expand Down Expand Up @@ -284,6 +296,9 @@ golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBn
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7 h1:EBZoQjiKKPaLbPrbpssUfuHtwM6KV/vb4U85g/cigFY=
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
Expand Down
71 changes: 70 additions & 1 deletion ironic/resource_ironic_deployment.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,18 @@
package ironic

import (
"crypto/tls"
"crypto/x509"
"encoding/base64"
"fmt"
"github.com/gophercloud/gophercloud/openstack/baremetal/v1/nodes"
utils "github.com/gophercloud/utils/openstack/baremetal/v1/nodes"
retryablehttp "github.com/hashicorp/go-retryablehttp"
"github.com/hashicorp/go-version"
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
"io/ioutil"
"log"
"net/http"
)

// Schema resource definition for an Ironic deployment.
Expand Down Expand Up @@ -36,6 +43,16 @@ func resourceDeployment() *schema.Resource {
Optional: true,
ForceNew: true,
},
"user_data_url": {
Type: schema.TypeString,
Optional: true,
ForceNew: true,
},
"user_data_url_ca_cert": {
Type: schema.TypeString,
Optional: true,
ForceNew: true,
},
"network_data": {
Type: schema.TypeMap,
Optional: true,
Expand Down Expand Up @@ -85,8 +102,18 @@ func resourceDeploymentCreate(d *schema.ResourceData, meta interface{}) error {

d.SetId(d.Get("node_uuid").(string))

userData := d.Get("user_data").(string)
userDataURL := d.Get("user_data_url").(string)
userDataCaCert := d.Get("user_data_url_ca_cert").(string)

// if user_data_url is specified in addition to user_data, use the former
ignitionData := fetchFullIgnition(userDataURL, userDataCaCert)
if ignitionData != "" {
userData = ignitionData
}

configDrive, err := buildConfigDrive(client.Microversion,
d.Get("user_data").(string),
userData,
d.Get("network_data").(map[string]interface{}),
d.Get("metadata").(map[string]interface{}))
if err != nil {
Expand All @@ -97,6 +124,48 @@ func resourceDeploymentCreate(d *schema.ResourceData, meta interface{}) error {
return ChangeProvisionStateToTarget(client, d.Id(), "active", &configDrive)
}

// fetchFullIgnition gets full igntion from the URL and cert passed to it and returns userdata as a string
func fetchFullIgnition(userDataURL string, userDataCaCert string) string {
// Send full ignition, if the URL is specified
if userDataURL != "" {
caCertPool := x509.NewCertPool()
transport := &http.Transport{}

if userDataCaCert != "" {
caCert, err := base64.StdEncoding.DecodeString(userDataCaCert)
if err != nil {
log.Printf("could not decode user_data_url_ca_cert: %s", err)
return ""
}
caCertPool.AppendCertsFromPEM(caCert)

transport.TLSClientConfig = &tls.Config{RootCAs: caCertPool}
} else {
// Disable certificate verification
transport.TLSClientConfig = &tls.Config{InsecureSkipVerify: true}
}

client := retryablehttp.NewClient()
Comment thread
kirankt marked this conversation as resolved.
client.HTTPClient.Transport = transport

// Get the data
resp, err := client.Get(userDataURL)
if err != nil {
log.Printf("could not get user_data_url: %s", err)
return ""
}
defer resp.Body.Close()
var userData []byte
userData, err = ioutil.ReadAll(resp.Body)
if err != nil {
log.Printf("could not read user_data_url: %s", err)
return ""
}
return string(userData)
}
return ""
}

// buildConfigDrive handles building a config drive appropriate for the Ironic version we are using. Newer versions
// support sending the user data directly, otherwise we need to build an ISO image
func buildConfigDrive(apiVersion, userData string, networkData, metaData map[string]interface{}) (configDrive interface{}, err error) {
Expand Down
62 changes: 62 additions & 0 deletions ironic/resource_ironic_deployment_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,11 @@
package ironic

import (
"encoding/base64"
"encoding/pem"
"fmt"
"net/http"
"net/http/httptest"
"testing"

"github.com/gophercloud/gophercloud"
Expand Down Expand Up @@ -111,3 +115,61 @@ func testAccDeploymentResource(node, resourceClass, allocation string) string {

`, node, node, resourceClass, allocation, allocation, resourceClass, node, node, node, allocation)
}

func TestFetchFullIgnition(t *testing.T) {
// Setup a fake https endpoint to server full ignition
server := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Full Ignition")
}))
defer server.Close()

cert := server.Certificate()
certInPem := pem.EncodeToMemory(
&pem.Block{
Type: "CERTIFICATE",
Bytes: cert.Raw,
},
)
certB64 := base64.URLEncoding.EncodeToString(certInPem)

testCases := []struct {
Scenario string
UserDataURL string
UserDataURLCACert string
ExpectResult bool
}{
{
Scenario: "user data url and ca cert present",
UserDataURL: server.URL,
UserDataURLCACert: certB64,
ExpectResult: true,
},
{
Scenario: "user data url present but no ca cert",
UserDataURL: server.URL,
UserDataURLCACert: "",
ExpectResult: true,
},
{
Scenario: "user data url is not present but ca cert is",
UserDataURL: "",
UserDataURLCACert: certB64,
ExpectResult: false,
},
{
Scenario: "neither user data url nor ca cert is not present",
UserDataURL: "",
UserDataURLCACert: "",
ExpectResult: false,
},
}
for _, tc := range testCases {
userData := fetchFullIgnition(tc.UserDataURL, tc.UserDataURLCACert)
if tc.ExpectResult && (userData != "Full Ignition\n") {
t.Errorf("expected userData: %s, got %s", "Full Ignition\n", userData)
}
if !tc.ExpectResult && (userData != "") {
t.Errorf("expected userData: %s, got %s", "", userData)
}
}
}
Loading