Merge pull request #4336 from iMartyn/feature/extra-terraform-config

Feature/extra terraform config
This commit is contained in:
k8s-ci-robot 2018-02-02 02:27:09 -08:00 committed by GitHub
commit 2abdaf52ac
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 482 additions and 15 deletions

View File

@ -439,3 +439,15 @@ Providing the name of a key already in AWS is an alternative to `--ssh-public-ke
spec:
sshKeyName: myexistingkey
```
### target
In some use-cases you may wish to augment the target output with extra options. `target` supports a minimal amount of options you can do this with. Currently only the terraform target supports this, but if other use cases present themselves, kops may eventually support more.
```yaml
spec:
target:
terraform:
providerExtraConfig:
alias: foo
```

View File

@ -160,6 +160,8 @@ type ClusterSpec struct {
IAM *IAMSpec `json:"iam,omitempty"`
// EncryptionConfig controls if encryption is enabled
EncryptionConfig *bool `json:"encryptionConfig,omitempty"`
// Target allows for us to nest extra config for targets such as terraform
Target *TargetSpec `json:"target,omitempty"`
}
// FileAssetSpec defines the structure for a file asset
@ -375,6 +377,25 @@ type HTTPProxy struct {
// Password string `json:"password,omitempty"`
}
// TargetSpec allows for specifying target config in an extensible way
type TargetSpec struct {
Terraform *TerraformSpec `json:"terraform,omitempty"`
}
func (t *TargetSpec) IsEmpty() bool {
return t.Terraform == nil
}
// TerraformSpec allows us to specify terraform config in an extensible way
type TerraformSpec struct {
// ProviderExtraConfig contains key/value pairs to add to the rendered terraform "provider" block
ProviderExtraConfig *map[string]string `json:"providerExtraConfig,omitempty"`
}
func (t *TerraformSpec) IsEmpty() bool {
return t.ProviderExtraConfig == nil
}
// FillDefaults populates default values.
// This is different from PerformAssignments, because these values are changeable, and thus we don't need to
// store them (i.e. we don't need to 'lock them')

View File

@ -159,6 +159,8 @@ type ClusterSpec struct {
IAM *IAMSpec `json:"iam,omitempty"`
// EncryptionConfig holds the encryption config
EncryptionConfig *bool `json:"encryptionConfig,omitempty"`
// Target allows for us to nest extra config for targets such as terraform
Target *TargetSpec `json:"target,omitempty"`
}
// FileAssetSpec defines the structure for a file asset
@ -361,3 +363,22 @@ type HTTPProxy struct {
// User string `json:"user,omitempty"`
// Password string `json:"password,omitempty"`
}
// TargetSpec allows for specifying target config in an extensible way
type TargetSpec struct {
Terraform *TerraformSpec `json:"terraform,omitempty"`
}
func (t *TargetSpec) IsEmpty() bool {
return t.Terraform == nil
}
// TerraformSpec allows us to specify terraform config in an extensible way
type TerraformSpec struct {
// ProviderExtraConfig contains key/value pairs to add to the rendered terraform "provider" block
ProviderExtraConfig *map[string]string `json:"providerExtraConfig,omitempty"`
}
func (t *TerraformSpec) IsEmpty() bool {
return t.ProviderExtraConfig == nil
}

View File

@ -141,6 +141,10 @@ func RegisterConversions(scheme *runtime.Scheme) error {
Convert_kops_SSHCredentialList_To_v1alpha1_SSHCredentialList,
Convert_v1alpha1_SSHCredentialSpec_To_kops_SSHCredentialSpec,
Convert_kops_SSHCredentialSpec_To_v1alpha1_SSHCredentialSpec,
Convert_v1alpha1_TargetSpec_To_kops_TargetSpec,
Convert_kops_TargetSpec_To_v1alpha1_TargetSpec,
Convert_v1alpha1_TerraformSpec_To_kops_TerraformSpec,
Convert_kops_TerraformSpec_To_v1alpha1_TerraformSpec,
Convert_v1alpha1_UserData_To_kops_UserData,
Convert_kops_UserData_To_v1alpha1_UserData,
Convert_v1alpha1_WeaveNetworkingSpec_To_kops_WeaveNetworkingSpec,
@ -833,6 +837,15 @@ func autoConvert_v1alpha1_ClusterSpec_To_kops_ClusterSpec(in *ClusterSpec, out *
out.IAM = nil
}
out.EncryptionConfig = in.EncryptionConfig
if in.Target != nil {
in, out := &in.Target, &out.Target
*out = new(kops.TargetSpec)
if err := Convert_v1alpha1_TargetSpec_To_kops_TargetSpec(*in, *out, s); err != nil {
return err
}
} else {
out.Target = nil
}
return nil
}
@ -1070,6 +1083,15 @@ func autoConvert_kops_ClusterSpec_To_v1alpha1_ClusterSpec(in *kops.ClusterSpec,
out.IAM = nil
}
out.EncryptionConfig = in.EncryptionConfig
if in.Target != nil {
in, out := &in.Target, &out.Target
*out = new(TargetSpec)
if err := Convert_kops_TargetSpec_To_v1alpha1_TargetSpec(*in, *out, s); err != nil {
return err
}
} else {
out.Target = nil
}
return nil
}
@ -2698,6 +2720,62 @@ func Convert_kops_SSHCredentialSpec_To_v1alpha1_SSHCredentialSpec(in *kops.SSHCr
return autoConvert_kops_SSHCredentialSpec_To_v1alpha1_SSHCredentialSpec(in, out, s)
}
func autoConvert_v1alpha1_TargetSpec_To_kops_TargetSpec(in *TargetSpec, out *kops.TargetSpec, s conversion.Scope) error {
if in.Terraform != nil {
in, out := &in.Terraform, &out.Terraform
*out = new(kops.TerraformSpec)
if err := Convert_v1alpha1_TerraformSpec_To_kops_TerraformSpec(*in, *out, s); err != nil {
return err
}
} else {
out.Terraform = nil
}
return nil
}
// Convert_v1alpha1_TargetSpec_To_kops_TargetSpec is an autogenerated conversion function.
func Convert_v1alpha1_TargetSpec_To_kops_TargetSpec(in *TargetSpec, out *kops.TargetSpec, s conversion.Scope) error {
return autoConvert_v1alpha1_TargetSpec_To_kops_TargetSpec(in, out, s)
}
func autoConvert_kops_TargetSpec_To_v1alpha1_TargetSpec(in *kops.TargetSpec, out *TargetSpec, s conversion.Scope) error {
if in.Terraform != nil {
in, out := &in.Terraform, &out.Terraform
*out = new(TerraformSpec)
if err := Convert_kops_TerraformSpec_To_v1alpha1_TerraformSpec(*in, *out, s); err != nil {
return err
}
} else {
out.Terraform = nil
}
return nil
}
// Convert_kops_TargetSpec_To_v1alpha1_TargetSpec is an autogenerated conversion function.
func Convert_kops_TargetSpec_To_v1alpha1_TargetSpec(in *kops.TargetSpec, out *TargetSpec, s conversion.Scope) error {
return autoConvert_kops_TargetSpec_To_v1alpha1_TargetSpec(in, out, s)
}
func autoConvert_v1alpha1_TerraformSpec_To_kops_TerraformSpec(in *TerraformSpec, out *kops.TerraformSpec, s conversion.Scope) error {
out.ProviderExtraConfig = in.ProviderExtraConfig
return nil
}
// Convert_v1alpha1_TerraformSpec_To_kops_TerraformSpec is an autogenerated conversion function.
func Convert_v1alpha1_TerraformSpec_To_kops_TerraformSpec(in *TerraformSpec, out *kops.TerraformSpec, s conversion.Scope) error {
return autoConvert_v1alpha1_TerraformSpec_To_kops_TerraformSpec(in, out, s)
}
func autoConvert_kops_TerraformSpec_To_v1alpha1_TerraformSpec(in *kops.TerraformSpec, out *TerraformSpec, s conversion.Scope) error {
out.ProviderExtraConfig = in.ProviderExtraConfig
return nil
}
// Convert_kops_TerraformSpec_To_v1alpha1_TerraformSpec is an autogenerated conversion function.
func Convert_kops_TerraformSpec_To_v1alpha1_TerraformSpec(in *kops.TerraformSpec, out *TerraformSpec, s conversion.Scope) error {
return autoConvert_kops_TerraformSpec_To_v1alpha1_TerraformSpec(in, out, s)
}
func autoConvert_v1alpha1_UserData_To_kops_UserData(in *UserData, out *kops.UserData, s conversion.Scope) error {
out.Name = in.Name
out.Type = in.Type

View File

@ -21,11 +21,10 @@ limitations under the License.
package v1alpha1
import (
reflect "reflect"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
conversion "k8s.io/apimachinery/pkg/conversion"
runtime "k8s.io/apimachinery/pkg/runtime"
reflect "reflect"
)
func init() {
@ -258,6 +257,14 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error {
in.(*SSHCredentialSpec).DeepCopyInto(out.(*SSHCredentialSpec))
return nil
}, InType: reflect.TypeOf(&SSHCredentialSpec{})},
conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error {
in.(*TargetSpec).DeepCopyInto(out.(*TargetSpec))
return nil
}, InType: reflect.TypeOf(&TargetSpec{})},
conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error {
in.(*TerraformSpec).DeepCopyInto(out.(*TerraformSpec))
return nil
}, InType: reflect.TypeOf(&TerraformSpec{})},
conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error {
in.(*TopologySpec).DeepCopyInto(out.(*TopologySpec))
return nil
@ -1044,6 +1051,15 @@ func (in *ClusterSpec) DeepCopyInto(out *ClusterSpec) {
**out = **in
}
}
if in.Target != nil {
in, out := &in.Target, &out.Target
if *in == nil {
*out = nil
} else {
*out = new(TargetSpec)
(*in).DeepCopyInto(*out)
}
}
return
}
@ -2939,6 +2955,62 @@ func (in *SSHCredentialSpec) DeepCopy() *SSHCredentialSpec {
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *TargetSpec) DeepCopyInto(out *TargetSpec) {
*out = *in
if in.Terraform != nil {
in, out := &in.Terraform, &out.Terraform
if *in == nil {
*out = nil
} else {
*out = new(TerraformSpec)
(*in).DeepCopyInto(*out)
}
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TargetSpec.
func (in *TargetSpec) DeepCopy() *TargetSpec {
if in == nil {
return nil
}
out := new(TargetSpec)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *TerraformSpec) DeepCopyInto(out *TerraformSpec) {
*out = *in
if in.ProviderExtraConfig != nil {
in, out := &in.ProviderExtraConfig, &out.ProviderExtraConfig
if *in == nil {
*out = nil
} else {
*out = new(map[string]string)
if **in != nil {
in, out := *in, *out
*out = make(map[string]string, len(*in))
for key, val := range *in {
(*out)[key] = val
}
}
}
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TerraformSpec.
func (in *TerraformSpec) DeepCopy() *TerraformSpec {
if in == nil {
return nil
}
out := new(TerraformSpec)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *TopologySpec) DeepCopyInto(out *TopologySpec) {
*out = *in

View File

@ -160,6 +160,8 @@ type ClusterSpec struct {
IAM *IAMSpec `json:"iam,omitempty"`
// EncryptionConfig holds the encryption config
EncryptionConfig *bool `json:"encryptionConfig,omitempty"`
// Target allows for us to nest extra config for targets such as terraform
Target *TargetSpec `json:"target,omitempty"`
}
// FileAssetSpec defines the structure for a file asset
@ -370,3 +372,22 @@ type HTTPProxy struct {
// User string `json:"user,omitempty"`
// Password string `json:"password,omitempty"`
}
// TargetSpec allows for specifying target config in an extensible way
type TargetSpec struct {
Terraform *TerraformSpec `json:"terraform,omitempty"`
}
func (t *TargetSpec) IsEmpty() bool {
return t.Terraform == nil
}
// TerraformSpec allows us to specify terraform config in an extensible way
type TerraformSpec struct {
// ProviderExtraConfig contains key/value pairs to add to the rendered terraform "provider" block
ProviderExtraConfig *map[string]string `json:"providerExtraConfig,omitempty"`
}
func (t *TerraformSpec) IsEmpty() bool {
return t.ProviderExtraConfig == nil
}

View File

@ -153,6 +153,10 @@ func RegisterConversions(scheme *runtime.Scheme) error {
Convert_kops_SSHCredentialList_To_v1alpha2_SSHCredentialList,
Convert_v1alpha2_SSHCredentialSpec_To_kops_SSHCredentialSpec,
Convert_kops_SSHCredentialSpec_To_v1alpha2_SSHCredentialSpec,
Convert_v1alpha2_TargetSpec_To_kops_TargetSpec,
Convert_kops_TargetSpec_To_v1alpha2_TargetSpec,
Convert_v1alpha2_TerraformSpec_To_kops_TerraformSpec,
Convert_kops_TerraformSpec_To_v1alpha2_TerraformSpec,
Convert_v1alpha2_TopologySpec_To_kops_TopologySpec,
Convert_kops_TopologySpec_To_v1alpha2_TopologySpec,
Convert_v1alpha2_UserData_To_kops_UserData,
@ -880,6 +884,15 @@ func autoConvert_v1alpha2_ClusterSpec_To_kops_ClusterSpec(in *ClusterSpec, out *
out.IAM = nil
}
out.EncryptionConfig = in.EncryptionConfig
if in.Target != nil {
in, out := &in.Target, &out.Target
*out = new(kops.TargetSpec)
if err := Convert_v1alpha2_TargetSpec_To_kops_TargetSpec(*in, *out, s); err != nil {
return err
}
} else {
out.Target = nil
}
return nil
}
@ -1132,6 +1145,15 @@ func autoConvert_kops_ClusterSpec_To_v1alpha2_ClusterSpec(in *kops.ClusterSpec,
out.IAM = nil
}
out.EncryptionConfig = in.EncryptionConfig
if in.Target != nil {
in, out := &in.Target, &out.Target
*out = new(TargetSpec)
if err := Convert_kops_TargetSpec_To_v1alpha2_TargetSpec(*in, *out, s); err != nil {
return err
}
} else {
out.Target = nil
}
return nil
}
@ -2960,6 +2982,62 @@ func Convert_kops_SSHCredentialSpec_To_v1alpha2_SSHCredentialSpec(in *kops.SSHCr
return autoConvert_kops_SSHCredentialSpec_To_v1alpha2_SSHCredentialSpec(in, out, s)
}
func autoConvert_v1alpha2_TargetSpec_To_kops_TargetSpec(in *TargetSpec, out *kops.TargetSpec, s conversion.Scope) error {
if in.Terraform != nil {
in, out := &in.Terraform, &out.Terraform
*out = new(kops.TerraformSpec)
if err := Convert_v1alpha2_TerraformSpec_To_kops_TerraformSpec(*in, *out, s); err != nil {
return err
}
} else {
out.Terraform = nil
}
return nil
}
// Convert_v1alpha2_TargetSpec_To_kops_TargetSpec is an autogenerated conversion function.
func Convert_v1alpha2_TargetSpec_To_kops_TargetSpec(in *TargetSpec, out *kops.TargetSpec, s conversion.Scope) error {
return autoConvert_v1alpha2_TargetSpec_To_kops_TargetSpec(in, out, s)
}
func autoConvert_kops_TargetSpec_To_v1alpha2_TargetSpec(in *kops.TargetSpec, out *TargetSpec, s conversion.Scope) error {
if in.Terraform != nil {
in, out := &in.Terraform, &out.Terraform
*out = new(TerraformSpec)
if err := Convert_kops_TerraformSpec_To_v1alpha2_TerraformSpec(*in, *out, s); err != nil {
return err
}
} else {
out.Terraform = nil
}
return nil
}
// Convert_kops_TargetSpec_To_v1alpha2_TargetSpec is an autogenerated conversion function.
func Convert_kops_TargetSpec_To_v1alpha2_TargetSpec(in *kops.TargetSpec, out *TargetSpec, s conversion.Scope) error {
return autoConvert_kops_TargetSpec_To_v1alpha2_TargetSpec(in, out, s)
}
func autoConvert_v1alpha2_TerraformSpec_To_kops_TerraformSpec(in *TerraformSpec, out *kops.TerraformSpec, s conversion.Scope) error {
out.ProviderExtraConfig = in.ProviderExtraConfig
return nil
}
// Convert_v1alpha2_TerraformSpec_To_kops_TerraformSpec is an autogenerated conversion function.
func Convert_v1alpha2_TerraformSpec_To_kops_TerraformSpec(in *TerraformSpec, out *kops.TerraformSpec, s conversion.Scope) error {
return autoConvert_v1alpha2_TerraformSpec_To_kops_TerraformSpec(in, out, s)
}
func autoConvert_kops_TerraformSpec_To_v1alpha2_TerraformSpec(in *kops.TerraformSpec, out *TerraformSpec, s conversion.Scope) error {
out.ProviderExtraConfig = in.ProviderExtraConfig
return nil
}
// Convert_kops_TerraformSpec_To_v1alpha2_TerraformSpec is an autogenerated conversion function.
func Convert_kops_TerraformSpec_To_v1alpha2_TerraformSpec(in *kops.TerraformSpec, out *TerraformSpec, s conversion.Scope) error {
return autoConvert_kops_TerraformSpec_To_v1alpha2_TerraformSpec(in, out, s)
}
func autoConvert_v1alpha2_TopologySpec_To_kops_TopologySpec(in *TopologySpec, out *kops.TopologySpec, s conversion.Scope) error {
out.Masters = in.Masters
out.Nodes = in.Nodes

View File

@ -21,11 +21,10 @@ limitations under the License.
package v1alpha2
import (
reflect "reflect"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
conversion "k8s.io/apimachinery/pkg/conversion"
runtime "k8s.io/apimachinery/pkg/runtime"
reflect "reflect"
)
func init() {
@ -274,6 +273,14 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error {
in.(*SSHCredentialSpec).DeepCopyInto(out.(*SSHCredentialSpec))
return nil
}, InType: reflect.TypeOf(&SSHCredentialSpec{})},
conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error {
in.(*TargetSpec).DeepCopyInto(out.(*TargetSpec))
return nil
}, InType: reflect.TypeOf(&TargetSpec{})},
conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error {
in.(*TerraformSpec).DeepCopyInto(out.(*TerraformSpec))
return nil
}, InType: reflect.TypeOf(&TerraformSpec{})},
conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error {
in.(*TopologySpec).DeepCopyInto(out.(*TopologySpec))
return nil
@ -1054,6 +1061,15 @@ func (in *ClusterSpec) DeepCopyInto(out *ClusterSpec) {
**out = **in
}
}
if in.Target != nil {
in, out := &in.Target, &out.Target
if *in == nil {
*out = nil
} else {
*out = new(TargetSpec)
(*in).DeepCopyInto(*out)
}
}
return
}
@ -3065,6 +3081,62 @@ func (in *SSHCredentialSpec) DeepCopy() *SSHCredentialSpec {
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *TargetSpec) DeepCopyInto(out *TargetSpec) {
*out = *in
if in.Terraform != nil {
in, out := &in.Terraform, &out.Terraform
if *in == nil {
*out = nil
} else {
*out = new(TerraformSpec)
(*in).DeepCopyInto(*out)
}
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TargetSpec.
func (in *TargetSpec) DeepCopy() *TargetSpec {
if in == nil {
return nil
}
out := new(TargetSpec)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *TerraformSpec) DeepCopyInto(out *TerraformSpec) {
*out = *in
if in.ProviderExtraConfig != nil {
in, out := &in.ProviderExtraConfig, &out.ProviderExtraConfig
if *in == nil {
*out = nil
} else {
*out = new(map[string]string)
if **in != nil {
in, out := *in, *out
*out = make(map[string]string, len(*in))
for key, val := range *in {
(*out)[key] = val
}
}
}
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TerraformSpec.
func (in *TerraformSpec) DeepCopy() *TerraformSpec {
if in == nil {
return nil
}
out := new(TerraformSpec)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *TopologySpec) DeepCopyInto(out *TopologySpec) {
*out = *in

View File

@ -21,11 +21,10 @@ limitations under the License.
package kops
import (
reflect "reflect"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
conversion "k8s.io/apimachinery/pkg/conversion"
runtime "k8s.io/apimachinery/pkg/runtime"
reflect "reflect"
)
func init() {
@ -314,6 +313,14 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error {
in.(*SSHCredentialSpec).DeepCopyInto(out.(*SSHCredentialSpec))
return nil
}, InType: reflect.TypeOf(&SSHCredentialSpec{})},
conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error {
in.(*TargetSpec).DeepCopyInto(out.(*TargetSpec))
return nil
}, InType: reflect.TypeOf(&TargetSpec{})},
conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error {
in.(*TerraformSpec).DeepCopyInto(out.(*TerraformSpec))
return nil
}, InType: reflect.TypeOf(&TerraformSpec{})},
conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error {
in.(*TopologySpec).DeepCopyInto(out.(*TopologySpec))
return nil
@ -1199,6 +1206,15 @@ func (in *ClusterSpec) DeepCopyInto(out *ClusterSpec) {
**out = **in
}
}
if in.Target != nil {
in, out := &in.Target, &out.Target
if *in == nil {
*out = nil
} else {
*out = new(TargetSpec)
(*in).DeepCopyInto(*out)
}
}
return
}
@ -3316,6 +3332,62 @@ func (in *SSHCredentialSpec) DeepCopy() *SSHCredentialSpec {
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *TargetSpec) DeepCopyInto(out *TargetSpec) {
*out = *in
if in.Terraform != nil {
in, out := &in.Terraform, &out.Terraform
if *in == nil {
*out = nil
} else {
*out = new(TerraformSpec)
(*in).DeepCopyInto(*out)
}
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TargetSpec.
func (in *TargetSpec) DeepCopy() *TargetSpec {
if in == nil {
return nil
}
out := new(TargetSpec)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *TerraformSpec) DeepCopyInto(out *TerraformSpec) {
*out = *in
if in.ProviderExtraConfig != nil {
in, out := &in.ProviderExtraConfig, &out.ProviderExtraConfig
if *in == nil {
*out = nil
} else {
*out = new(map[string]string)
if **in != nil {
in, out := *in, *out
*out = make(map[string]string, len(*in))
for key, val := range *in {
(*out)[key] = val
}
}
}
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TerraformSpec.
func (in *TerraformSpec) DeepCopy() *TerraformSpec {
if in == nil {
return nil
}
out := new(TerraformSpec)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *TopologySpec) DeepCopyInto(out *TopologySpec) {
*out = *in

View File

@ -17,8 +17,6 @@ limitations under the License.
package scheme
import (
os "os"
announced "k8s.io/apimachinery/pkg/apimachinery/announced"
registered "k8s.io/apimachinery/pkg/apimachinery/registered"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@ -26,6 +24,7 @@ import (
schema "k8s.io/apimachinery/pkg/runtime/schema"
serializer "k8s.io/apimachinery/pkg/runtime/serializer"
kops "k8s.io/kops/pkg/apis/kops/install"
os "os"
)
var Scheme = runtime.NewScheme()

View File

@ -17,8 +17,6 @@ limitations under the License.
package scheme
import (
os "os"
announced "k8s.io/apimachinery/pkg/apimachinery/announced"
registered "k8s.io/apimachinery/pkg/apimachinery/registered"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@ -26,6 +24,7 @@ import (
schema "k8s.io/apimachinery/pkg/runtime/schema"
serializer "k8s.io/apimachinery/pkg/runtime/serializer"
kops "k8s.io/kops/pkg/apis/kops/install"
os "os"
)
var Scheme = runtime.NewScheme()

View File

@ -659,7 +659,7 @@ func (c *ApplyClusterCmd) Run() error {
case TargetTerraform:
checkExisting = false
outDir := c.OutDir
tf := terraform.NewTerraformTarget(cloud, region, project, outDir)
tf := terraform.NewTerraformTarget(cloud, region, project, outDir, cluster.Spec.Target)
// We include a few "util" variables in the TF output
if err := tf.AddOutputVariable("region", terraform.LiteralFromStringValue(region)); err != nil {

View File

@ -48,17 +48,20 @@ type TerraformTarget struct {
outputs map[string]*terraformOutputVariable
// files is a map of TF resource files that should be created
files map[string][]byte
// extra config to add to the provider block
clusterSpecTarget *kops.TargetSpec
}
func NewTerraformTarget(cloud fi.Cloud, region, project string, outDir string) *TerraformTarget {
func NewTerraformTarget(cloud fi.Cloud, region, project string, outDir string, clusterSpecTarget *kops.TargetSpec) *TerraformTarget {
return &TerraformTarget{
Cloud: cloud,
Region: region,
Project: project,
outDir: outDir,
files: make(map[string][]byte),
outputs: make(map[string]*terraformOutputVariable),
outDir: outDir,
files: make(map[string][]byte),
outputs: make(map[string]*terraformOutputVariable),
clusterSpecTarget: clusterSpecTarget,
}
}
@ -158,6 +161,16 @@ func (t *TerraformTarget) AddOutputVariableArray(key string, literal *Literal) e
return nil
}
// tfGetProviderExtraConfig is a helper function to get extra config with safety checks on the pointers.
func tfGetProviderExtraConfig(c *kops.TargetSpec) map[string]string {
if c != nil &&
c.Terraform != nil &&
c.Terraform.ProviderExtraConfig != nil {
return *c.Terraform.ProviderExtraConfig
}
return nil
}
func (t *TerraformTarget) Finish(taskMap map[string]fi.Task) error {
resourcesByType := make(map[string]map[string]interface{})
@ -182,14 +195,23 @@ func (t *TerraformTarget) Finish(taskMap map[string]fi.Task) error {
providerGoogle := make(map[string]interface{})
providerGoogle["project"] = t.Project
providerGoogle["region"] = t.Region
for k, v := range tfGetProviderExtraConfig(t.clusterSpecTarget) {
providerGoogle[k] = v
}
providersByName["google"] = providerGoogle
} else if t.Cloud.ProviderID() == kops.CloudProviderAWS {
providerAWS := make(map[string]interface{})
providerAWS["region"] = t.Region
for k, v := range tfGetProviderExtraConfig(t.clusterSpecTarget) {
providerAWS[k] = v
}
providersByName["aws"] = providerAWS
} else if t.Cloud.ProviderID() == kops.CloudProviderVSphere {
providerVSphere := make(map[string]interface{})
providerVSphere["region"] = t.Region
for k, v := range tfGetProviderExtraConfig(t.clusterSpecTarget) {
providerVSphere[k] = v
}
providersByName["vsphere"] = providerVSphere
}