@@ -7,6 +7,7 @@ package provider
77import (
88 "context"
99 "fmt"
10+ "os"
1011 "testing"
1112 "time"
1213
@@ -15,23 +16,36 @@ import (
1516 "github.com/oxidecomputer/oxide.go/oxide"
1617)
1718
18- // This self-signed TLS certificate and key are just for testing. It's not
19- // critical to anything nor is it a security risk.
20- // TODO: Configure the TLS certificate and key in another way to prevent static
21- // analysis tools from flagging this as a false positive.
22- const (
23- tlsCertificateBase64 = "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdDVENDQS9HZ0F3SUJBZ0lVYjB2YzdFUkZGQ3ZtcGpuak5YREFVTmVsclBZd0RRWUpLb1pJaHZjTkFRRUwKQlFBd2daTXhDekFKQmdOVkJBWVRBbFZUTVJNd0VRWURWUVFJREFwRFlXeHBabTl5Ym1saE1STXdFUVlEVlFRSApEQXBGYldWeWVYWnBiR3hsTVI4d0hRWURWUVFLREJaUGVHbGtaU0JEYjIxd2RYUmxjaUJEYjIxd1lXNTVNUlF3CkVnWURWUVFMREF0RmJtZHBibVZsY21sdVp6RWpNQ0VHQTFVRUF3d2FLaTV6ZVhNdWNqTXViM2hwWkdVdGNISmwKZG1sbGR5NWpiMjB3SGhjTk1qVXdOREkyTURJME1UUTVXaGNOTWpZd05ESTJNREkwTVRRNVdqQ0JrekVMTUFrRwpBMVVFQmhNQ1ZWTXhFekFSQmdOVkJBZ01Da05oYkdsbWIzSnVhV0V4RXpBUkJnTlZCQWNNQ2tWdFpYSjVkbWxzCmJHVXhIekFkQmdOVkJBb01Gazk0YVdSbElFTnZiWEIxZEdWeUlFTnZiWEJoYm5reEZEQVNCZ05WQkFzTUMwVnUKWjJsdVpXVnlhVzVuTVNNd0lRWURWUVFEREJvcUxuTjVjeTV5TXk1dmVHbGtaUzF3Y21WMmFXVjNMbU52YlRDQwpBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQUptRU1oQU1Pbm52Qkd0UUhsbEJKWk1KCmgzTjR6Z3E2YjQ4cGJqOHErbGZtVzBmd092ek5MV3dvTDRtNGNkZkh0WE95RkpOU3dONHhhblNsM2krM09qREMKM1hZMURMZllNQi9sdzk1WlZVYktGdlZ4Z1pSWmpZVHN6eTR1emMrZ3hHejFrSGpMYlc2U2hlcG1DK01IblNEWApXZGhEUVBFSTY4WVVWN1lOWXJ5YlBxNXlFRWFvNlJCRkEvOTBqNHE1MHpSMVpRSExIL1BDcmYyTkt3VmhhUjZHCjE3U3NnZHg5YkJmcUFiM2tFMmxCUVZMdUpqMjRMWUc1ZUNSajd3SzRwREx2VXNJNkdSblpUanMwN24zSTVrWHkKSjVubWFERTB5amN0U1lFaWc4dTNIODcveGlxVEdtOVRIaHMrSHI5cHM1RGxmZFpINHNSUWNiYWZHb2lGUmQ1ZgpxandIMk9HdWJ6NXRGQ3JFV3JBMkRMaWtHYTVrMGxmL2svY2w0Zy9MdlpOZDJqcVdJQmxBdzM4RDl5OWFjbStBCkJjYjRoRlRXYjFwKzhuSDZBdyt1cGxQTkU2U2dLQTA3Ny95TG5UVnByQm9uaEs2OVQ1dWlvM1FOZG9hVUg5NkEKUkZQdklHWXJRTHpYN204eFpub0Fab2lSY21zVmhvZTVSRExhZFJIaUsrUFROSmhzdlRuTFJ5RUxMUnppTlpwRApyUitqMk5PZXVILzNnblBHdm5qVnJCZjRpUGYzY0I0WlZMajZRZE5ueHdUWUhXWS95Y096cGY0ODJoRk9QbzRBCkg3WUVtTzRTcGdvRndTdlFjbGZ3R3g3eW9Sb1Bzc2hmRzhJYW5CN2ZTZDlQYmFNemUwMzhEQkxVMk5qaDVlb28KQWlHSFB3OC92TnpHd2hoaXZvSExBZ01CQUFHalV6QlJNQjBHQTFVZERnUVdCQlJQRlhUdm83OHdwUWtLaHhDMgo0OXpnL01DSTZEQWZCZ05WSFNNRUdEQVdnQlJQRlhUdm83OHdwUWtLaHhDMjQ5emcvTUNJNkRBUEJnTlZIUk1CCkFmOEVCVEFEQVFIL01BMEdDU3FHU0liM0RRRUJDd1VBQTRJQ0FRQ0VmRFpzZTRIRW1PME03dWRjR2hHeWZpTXoKN3A2Y0lXQS9XVThaSEFLT04zSGlwYUpwalp4OE1aVkVaMzVobTRROFEzYkxoRHpZVTJmV3RMMXhBN0JyaHZCMQpudGN0VXRVOGtCN1JKbzl3VjU5UFREaFhzMzRiV1JyZ1lzZkRFL3ExZjNCQ2xRanhBTTA0T3hJeXVKSzNkendUCnBvbXdNaFpKSmRYcXhoL1NnR0IwdzhZUkw5WEV6dVh1aFJoNmk2b0N2Y0FQQ0VDcjVuQllraWlVSmJiams4YVMKdDVQMVJSTFdEV2MrSGloYWx4cmlFRjRUbFFUbW96N2cxdzZJVDdYZjFkZ1A1aTlaN1Vad1RWQlRnZG1naW5JVgp4SnFTOVJNN3pVSTJqWHU5aTk0Zk5qOVA4VUJWRysxS3BqazQvaE5VOWp2TGNGRFNPRjZkSnZwRmFmKzg1di9WCjJ2WFVMb1FJV3IvcDF2dUdMTmxnb0M1WFptN2ZzdDlRcEdva1hlMEwySWp0Q1pncWRKRzVBOHhiaDJEa1orbEQKNXk5akVMOTRGRXNBTndFelhxQlVDQWpjZ2pwUVJBajM2Nk9tb1pSVDFCeUNYK0RXNFBXRnJvclorc0Z6VStmNQpCQUpFaTJVNmg2VGdaQ2d1Ty81Z0l6QWtDL0xXdThYb0lwNExGVnVWRmhvQzJSZm40YWhxdm42RHNSdTVqcWoyCnhIa1RLUVdmZlN3dGQ5akRQWm9Db2JEYkFXREdOWllTQ2tyMU5icmZYOGRBL3cwK2ZXb1NMVjhiOEhzMG5CSUgKNWpkdkJOQTdVR1UzK0tnamFrenJSRVkwWnRJUEJGdEZZVGMxb3Y0aHQrZVpxeEQxcEh5VFArMHltYkJYZXlaeQpKMlVJRnQwUThQSzhOUkdXRkE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg=="
24- tlsPrivateKeyBase64 = "LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUpRZ0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQ1N3d2dna29BZ0VBQW9JQ0FRQ1poRElRRERwNTd3UnIKVUI1WlFTV1RDWWR6ZU00S3VtK1BLVzQvS3ZwWDVsdEg4RHI4elMxc0tDK0p1SEhYeDdWenNoU1RVc0RlTVdwMApwZDR2dHpvd3d0MTJOUXkzMkRBZjVjUGVXVlZHeWhiMWNZR1VXWTJFN004dUxzM1BvTVJzOVpCNHkyMXVrb1hxClpndmpCNTBnMTFuWVEwRHhDT3ZHRkZlMkRXSzhtejZ1Y2hCR3FPa1FSUVAvZEkrS3VkTTBkV1VCeXgvendxMzkKalNzRllXa2VodGUwcklIY2ZXd1g2Z0c5NUJOcFFVRlM3aVk5dUMyQnVYZ2tZKzhDdUtReTcxTENPaGtaMlU0NwpOTzU5eU9aRjhpZVo1bWd4Tk1vM0xVbUJJb1BMdHgvTy84WXFreHB2VXg0YlBoNi9hYk9RNVgzV1IrTEVVSEcyCm54cUloVVhlWDZvOEI5amhybTgrYlJRcXhGcXdOZ3k0cEJtdVpOSlgvNVAzSmVJUHk3MlRYZG82bGlBWlFNTi8KQS9jdlduSnZnQVhHK0lSVTFtOWFmdkp4K2dNUHJxWlR6Uk9rb0NnTk8rLzhpNTAxYWF3YUo0U3V2VStib3FOMApEWGFHbEIvZWdFUlQ3eUJtSzBDODErNXZNV1o2QUdhSWtYSnJGWWFIdVVReTJuVVI0aXZqMHpTWWJMMDV5MGNoCkN5MGM0aldhUTYwZm85alRucmgvOTRKenhyNTQxYXdYK0lqMzkzQWVHVlM0K2tIVFo4Y0UyQjFtUDhuRHM2WCsKUE5vUlRqNk9BQisyQkpqdUVxWUtCY0VyMEhKWDhCc2U4cUVhRDdMSVh4dkNHcHdlMzBuZlQyMmpNM3ROL0F3UwoxTmpZNGVYcUtBSWhoejhQUDd6Y3hzSVlZcjZCeXdJREFRQUJBb0lDQUNITDlLbUx4NlBvZHZTWkl0VkxmbFlzCmx1RlpDeU5aZ0Ezb2RSajdBVG93d0kvSjEzS29TUU95cFNTUXNwOXFuQXZvZkpjaWRNdDEzWlhvbmsycTdPaW4KUGRJMFE2U0Z0N0tPQnQwQWxjR0w1Qm9NN3hZVjBRNGVoRTRLaDh6WisrUncrMmxjZjY4RUd1OUxuL3BQUnN4ZwpIS3Q3d3VSTnJucGhLQjR3UERpQmhQOHFwV0tvOVFaYjYxRmwrK1B5blFqRGY0VXhqc3MvWk1hWk9ZdHBzcGJCCjRPTXB4ejBmYjVpa0w5WDZURHV6M2dtLzNETmlSTUoyYm5pMGQzNEY0RUJHWjlYU3JJd0FSelRKcG1lU3Z2OVAKSEdESlZNN2diRlJSYUFsQjYvb0JTc05yazlqem9iSTRmanhKSk1QSEpYMFV5T3RQMENDZ0JTakxSakFnQncxaQpmQmh4bS9pQmhveU50UFVWeGVRa2VQSE81d2lSZVQydDErTDZha0tmMlVXLzIrZTBvYlNqSGJsWkFWaGVRN3FJClcvREwyRURBZnFTMlZ4clVtY09xVzBHd21IQTFFMDRhRG5lOC9aZ1NoVVJ1Z2xlcndsMGhzeFdhcFAwNlFrWFUKYTN4TEpQZ1RwYzBJY25ySE0wdHNIaUhNY3E2KzJ3MFF0eHpuYkZ0em9wSkx1c01jUXhNSmxKdkFGcFkzdWZNWgpIMFUxY3RuQXprQmVWUVNvRE9SY1dSVGd0aFlZbllYMnpyb1NpeGlJZ1RrRWlXa25McGxsUWFrMjZvTWtRZFZmClB4L2lycjYvNUdTMTJsYm41WldCRTBUMXhyZzkxNXlRZ2NwamRneXNQTW1TbDRGUUtvSnBvbENSTE5taGdOZmcKUWpWV00xL1FZMUlGWDBILzZEcmhBb0lCQVFES1BtckJiOVlURXNTYTZadnFMdk5wRnpnWFUybU9JSE5MY2p3Uwozb0VzQUhXL2FITzhpZWNMUzBEazBBZ3dDNFJndGg0ckNtbllUbU5CVERCNjkwN2t3R3RGMTBMZ1dzeHA3L0I1CkxLeDhINGtIZzdCYWd3VExGSDgxUDFWL1I2OUJuS2NhZnZoVkpzYUxlUVVtekJnRndwQWNxbVBKMk5abVJjZE4KVG9USG9pMHF0c0VHai83TjBaakNWQWtmZUJHWU1mSFY3YVVBWDhRRDgrSWcyazFCNEduaHRhSHA2c1MvbktBNQpSWHFqM05QUU41bEtCd0FKVzIwUytiMjJHZmlaUnh0ZHFGY3JRZXRHUUZ2cElWSzJPMDNmNjZuYmpvNjNwdXZvCjFkejlFckduckFIT1VhU3dvd2tXaW8xc3VjN0d0TU42NzJDSHFNa1ZqbFJHUlFmM0FvSUJBUURDVWlUc0RlRGEKd2NuZnhDcE9UUStWbEtlRVVGSXNMM1czeTJteXdKeHRJd0UxcUtXTjFWYjFWczVja1dBWHppdVFlQ29lbEhPSQpISGthcWJaM0ZoeEZWdVdNemhOTURhUHlFZWFKY0JjVnhGN1BIY1VrOGd3V3BsR2xrTlZCYktpaHgvU0pxUnVqCmR0cVVTc1hyK2hRejlZNDhFTGdpSUpsN08zL04vMlRjcnpsWmpQcXdxT0RGaWVER2tpSlhFam5EcEJiTDNBSU4KdEE1RkZKV0lWc2pVN0dCNzFyRnJFZmpTT0IzWFpIc05hV3RXNnlvakhmUmE5Y2dEKzBLQytjSUdVRm5rZjI3VQpCOWdwTXZEdjkyMXdPZGh2akJpYzVvSEN2VCsxa0ZDL1Y0S00xcVBpazB0bEJNajBPR0tmeUlIWWdBT00xTGlvCjFhWVk4VFJWbzZmTkFvSUJBRWUzcXBPOTNPUVdtN0Z6ZGQ2dGw1T0VzRmRWTlBFNWdLa1ljVVVmc2g2d2F4RGQKTVcyQ1dYUWYwM3RRYWhiZmZxbnM2dlhJVTVCbys3bUVFdzBIOWVvWWNmSHFTOFRUYmZtREpIdFQ1RFovMkUvWgoyd2U5dmsxbGoxYUtodjhEcEpwWHVzb2lqRjFseXJKYTBBRGFEd3E3Mis3T1hXU09pRGpzTmFpc1YxbVRvUUNzCm5mWjl5WldpNWRERGpCaWtzMWlOSFgwSE1LUFpVZUUwOHRORGxuSHQ2cDRua3Fzb25XeDFWanY0NzJ4OE9vQnoKdHVBUmEybm1DZC9Zdi9WN2NEU3Fpb0hEMkdWMmtyL3V3cWtCTUJ0L0hEWnprMkJRUlR2SzdZMDdpWW9VdnZyKwpmQVYxM2pqbEY2dnVwZ2dRTzhzcS9zYnhiQUd2VU45Y0FYYUp0REVDZ2dFQkFJalRVbEFzVFlGN0ptdzdNaGJFClNBN3BCek14WTByZGVDUWNSS2FxM1BvenhheEV2WjJxOUhuM3o0SjZrcER3aU5oRzVGRjM4Z21MRXZMbFFTZUYKR0E3eTZ0dEVWMjRieEs2MFVBSENQVjhFVUVYQ0RvaS9MaWZjb0d6V0dITGkwYkpvbXhVN1Q4eS82WlMxT2J1NAo4UFROR0lQT3VmaTl2NVI0QnJ2RDh2ODVHa2FsNy9ib1VxeUZNeEplMzNNejBCeWpzN0dEanFhYmU5akViNjM2CmZaci9mY2gxR2FQc21hbGIvaGNtRjBjUVRaWjhLOFZpV0NhY0hXUkFUVXJ3RmVCZ1A0dVc5ekN3L1ZHMUh0VzUKQVFRZWx2bWtTY2hndmttaSsvTWFWT0VGKzFTejVkMnFIVkphRmkxd2JuRlh1Nlg0TFlmQ1dPdjQwK1dJSVhPVApzcGtDZ2dFQU5rbi9Pb1VpQmVReVRFQ3VKRlBJSjBXa2VoL0lKdW5BOHIzdkxObEV6ZlB0QjA5KzFyNm9NeTdPClpZNmQxL3VQRkxGRkNSMUtBaDlQdTZUUHpkSUcybFNOSVhYNm9GdmcyWENwcGZucXI0RmFJWHMrYzVzWWtMamoKSitTL0svRTBzOVg4cEtjL3FBLytmSXRtTW1oRFRaV0dOZEhOU3YzQzZLcnBkSXptdmhjQ2FHUjIxNWlkaW5KaApCeWR2M0hPZk5DMG5BLzFtZ2hoUTNOQXY1bWZ1cFBKVUR0S1RqSi94UHdqRmppNFBEem56UXE5VlRVYlZLcElOCko1dTNrZ3FDSmFrcFJVWTRFM2pndmN3bWhHUVlhNVpvUDFOVnhZUTQwcXdTM2VBNzhyaldoaGdralA1T1RmdEcKY3Z4WGNOUlVsN1owTGt6UWlCLzh4OWxHd2VYdXJBPT0KLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLQo="
25- )
26-
2719type resourceSiloConfig struct {
28- BlockName string
29- SiloName string
30- TLSCertificateBase64 string
31- TLSPrivateKeyBase64 string
20+ BlockName string
21+ SiloName string
22+ SiloDNSName string
3223}
3324
3425var resourceSiloConfigTpl = `
26+ resource "tls_private_key" "self-signed" {
27+ algorithm = "RSA"
28+ rsa_bits = 2048
29+ }
30+
31+ resource "tls_self_signed_cert" "self-signed" {
32+ private_key_pem = tls_private_key.self-signed.private_key_pem
33+ validity_period_hours = 8760
34+
35+ subject {
36+ common_name = "{{.SiloDNSName}}"
37+ organization = "Oxide Computer Company"
38+ }
39+
40+ dns_names = ["{{.SiloDNSName}}"]
41+
42+ allowed_uses = [
43+ "key_encipherment",
44+ "digital_signature",
45+ "server_auth",
46+ ]
47+ }
48+
3549resource "oxide_silo" "{{.BlockName}}" {
3650 name = "{{.SiloName}}"
3751 description = "Managed by Terraform."
@@ -53,8 +67,8 @@ resource "oxide_silo" "{{.BlockName}}" {
5367 {
5468 name = "self-signed-wildcard"
5569 description = "Self-signed wildcard certificate for *.sys.r3.oxide-preview.com."
56- cert = base64decode("{{.TLSCertificateBase64}}")
57- key = base64decode("{{.TLSPrivateKeyBase64}}")
70+ cert = tls_self_signed_cert.self-signed.cert_pem
71+ key = tls_private_key.self-signed.private_key_pem
5872 service = "external_api"
5973 },
6074 ]
@@ -69,6 +83,29 @@ resource "oxide_silo" "{{.BlockName}}" {
6983`
7084
7185var resourceSiloUpdateConfigTpl = `
86+ resource "tls_private_key" "self-signed" {
87+ algorithm = "RSA"
88+ rsa_bits = 2048
89+ }
90+
91+ resource "tls_self_signed_cert" "self-signed" {
92+ private_key_pem = tls_private_key.self-signed.private_key_pem
93+ validity_period_hours = 8760
94+
95+ subject {
96+ common_name = "{{.SiloDNSName}}"
97+ organization = "Oxide Computer Company"
98+ }
99+
100+ dns_names = ["{{.SiloDNSName}}"]
101+
102+ allowed_uses = [
103+ "key_encipherment",
104+ "digital_signature",
105+ "server_auth",
106+ ]
107+ }
108+
72109resource "oxide_silo" "{{.BlockName}}" {
73110 name = "{{.SiloName}}"
74111 description = "Managed by Terraform."
@@ -90,8 +127,8 @@ resource "oxide_silo" "{{.BlockName}}" {
90127 {
91128 name = "self-signed-wildcard"
92129 description = "Self-signed wildcard certificate for *.sys.r3.oxide-preview.com."
93- cert = base64decode("{{.TLSCertificateBase64}}")
94- key = base64decode("{{.TLSPrivateKeyBase64}}")
130+ cert = tls_self_signed_cert.self-signed.cert_pem
131+ key = tls_private_key.self-signed.private_key_pem
95132 service = "external_api"
96133 },
97134 ]
@@ -102,12 +139,17 @@ func TestAccSiloResourceSilo_full(t *testing.T) {
102139 siloName := newResourceName ()
103140 blockName := newBlockName ("silo" )
104141 resourceName := fmt .Sprintf ("oxide_silo.%s" , blockName )
142+
143+ dnsName := os .Getenv ("OXIDE_SILO_DNS_NAME" )
144+ if dnsName == "" {
145+ dnsName = "*.sys.oxide-dev.test"
146+ }
147+
105148 config , err := parsedAccConfig (
106149 resourceSiloConfig {
107- BlockName : blockName ,
108- SiloName : siloName ,
109- TLSCertificateBase64 : tlsCertificateBase64 ,
110- TLSPrivateKeyBase64 : tlsPrivateKeyBase64 ,
150+ BlockName : blockName ,
151+ SiloName : siloName ,
152+ SiloDNSName : dnsName ,
111153 },
112154 resourceSiloConfigTpl ,
113155 )
@@ -117,10 +159,9 @@ func TestAccSiloResourceSilo_full(t *testing.T) {
117159
118160 configUpdate , err := parsedAccConfig (
119161 resourceSiloConfig {
120- BlockName : blockName ,
121- SiloName : siloName ,
122- TLSCertificateBase64 : tlsCertificateBase64 ,
123- TLSPrivateKeyBase64 : tlsPrivateKeyBase64 ,
162+ BlockName : blockName ,
163+ SiloName : siloName ,
164+ SiloDNSName : dnsName ,
124165 },
125166 resourceSiloUpdateConfigTpl ,
126167 )
@@ -131,7 +172,12 @@ func TestAccSiloResourceSilo_full(t *testing.T) {
131172 resource .ParallelTest (t , resource.TestCase {
132173 PreCheck : func () { testAccPreCheck (t ) },
133174 ProtoV6ProviderFactories : testAccProtoV6ProviderFactories (),
134- CheckDestroy : testAccSiloDestroy ,
175+ ExternalProviders : map [string ]resource.ExternalProvider {
176+ "tls" : {
177+ Source : "hashicorp/tls" ,
178+ },
179+ },
180+ CheckDestroy : testAccSiloDestroy ,
135181 Steps : []resource.TestStep {
136182 {
137183 Config : config ,
0 commit comments