Skip to content

Commit

Permalink
review changes
Browse files Browse the repository at this point in the history
  • Loading branch information
jmdeal committed Feb 28, 2024
1 parent ceec815 commit c439ea5
Show file tree
Hide file tree
Showing 7 changed files with 53 additions and 63 deletions.
10 changes: 5 additions & 5 deletions pkg/controllers/nodeclass/suite_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -111,9 +111,9 @@ var _ = Describe("NodeClassController", func() {
Context("Cluster CIDR Resolution", func() {
BeforeEach(func() {
// Cluster CIDR will only be resolved once per lifetime of the launch template provider, reset to nil between tests
awsEnv.LaunchTemplateProvider.ClusterCIDR = nil
awsEnv.LaunchTemplateProvider.ClusterCIDR.Store(nil)
})
It("should only resolve cluster CIDR for AL2023", func() {
It("shouldn't resolve cluster CIDR for non-AL2023 NodeClasses", func() {
for _, family := range []string{
v1beta1.AMIFamilyAL2,
v1beta1.AMIFamilyBottlerocket,
Expand All @@ -125,14 +125,14 @@ var _ = Describe("NodeClassController", func() {
nodeClass.Spec.AMIFamily = lo.ToPtr(family)
ExpectApplied(ctx, env.Client, nodeClass)
ExpectReconcileSucceeded(ctx, nodeClassController, client.ObjectKeyFromObject(nodeClass))
Expect(awsEnv.LaunchTemplateProvider.ClusterCIDR).To(BeNil())
Expect(awsEnv.LaunchTemplateProvider.ClusterCIDR.Load()).To(BeNil())
}
})
It("should resolve cluster CIDR for IPv4 clusters", func() {
nodeClass.Spec.AMIFamily = lo.ToPtr(v1beta1.AMIFamilyAL2023)
ExpectApplied(ctx, env.Client, nodeClass)
ExpectReconcileSucceeded(ctx, nodeClassController, client.ObjectKeyFromObject(nodeClass))
Expect(lo.FromPtr(awsEnv.LaunchTemplateProvider.ClusterCIDR)).To(Equal("10.100.0.0/16"))
Expect(lo.FromPtr(awsEnv.LaunchTemplateProvider.ClusterCIDR.Load())).To(Equal("10.100.0.0/16"))
})
It("should resolve cluster CIDR for IPv6 clusters", func() {
awsEnv.EKSAPI.DescribeClusterBehavior.Output.Set(&eks.DescribeClusterOutput{
Expand All @@ -145,7 +145,7 @@ var _ = Describe("NodeClassController", func() {
nodeClass.Spec.AMIFamily = lo.ToPtr(v1beta1.AMIFamilyAL2023)
ExpectApplied(ctx, env.Client, nodeClass)
ExpectReconcileSucceeded(ctx, nodeClassController, client.ObjectKeyFromObject(nodeClass))
Expect(lo.FromPtr(awsEnv.LaunchTemplateProvider.ClusterCIDR)).To(Equal("2001:db8::/64"))
Expect(lo.FromPtr(awsEnv.LaunchTemplateProvider.ClusterCIDR.Load())).To(Equal("2001:db8::/64"))
})
})
Context("Subnet Status", func() {
Expand Down
20 changes: 11 additions & 9 deletions pkg/providers/amifamily/al2023.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,15 +52,17 @@ func (a AL2023) DefaultAMIs(version string) []DefaultAMIOutput {
func (a AL2023) UserData(kubeletConfig *corev1beta1.KubeletConfiguration, taints []v1.Taint, labels map[string]string, caBundle *string, _ []*cloudprovider.InstanceType, customUserData *string, instanceStorePolicy *v1beta1.InstanceStorePolicy) bootstrap.Bootstrapper {
return bootstrap.Nodeadm{
Options: bootstrap.Options{
ClusterName: a.Options.ClusterName,
ClusterEndpoint: a.Options.ClusterEndpoint,
ClusterCIDR: a.Options.ClusterCIDR,
KubeletConfig: kubeletConfig,
Taints: taints,
Labels: labels,
CABundle: caBundle,
CustomUserData: customUserData,
InstanceStorePolicy: instanceStorePolicy,
ClusterName: a.Options.ClusterName,
ClusterEndpoint: a.Options.ClusterEndpoint,
ClusterCIDR: a.Options.ClusterCIDR,
KubeletConfig: kubeletConfig,
Taints: taints,
Labels: labels,
CABundle: caBundle,
AWSENILimitedPodDensity: false,
ContainerRuntime: new(string),
CustomUserData: customUserData,
InstanceStorePolicy: instanceStorePolicy,
},
}
}
Expand Down
6 changes: 1 addition & 5 deletions pkg/providers/amifamily/bootstrap/nodeadm.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,14 +66,10 @@ func (n Nodeadm) getNodeConfigYAML() (string, error) {
Cluster: admv1alpha1.ClusterDetails{
Name: n.ClusterName,
APIServerEndpoint: n.ClusterEndpoint,
CIDR: lo.FromPtr(n.ClusterCIDR),
},
},
}
if cidr := lo.FromPtr(n.ClusterCIDR); cidr != "" {
config.Spec.Cluster.CIDR = cidr
} else {
return "", fmt.Errorf("resolving cluster CIDR")
}
if lo.FromPtr(n.CABundle) != "" {
ca, err := base64.StdEncoding.DecodeString(*n.CABundle)
if err != nil {
Expand Down
2 changes: 1 addition & 1 deletion pkg/providers/instancetype/suite_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1597,7 +1597,7 @@ var _ = Describe("InstanceTypes", func() {
It("should default to EBS defaults when volumeSize is not defined in blockDeviceMappings for AL2023 Root volume", func() {
nodeClass.Spec.AMIFamily = aws.String(v1beta1.AMIFamilyAL2023)
awsEnv.LaunchTemplateProvider.CABundle = lo.ToPtr("Y2EtYnVuZGxlCg==")
awsEnv.LaunchTemplateProvider.ClusterCIDR = lo.ToPtr("10.100.0.0/16")
awsEnv.LaunchTemplateProvider.ClusterCIDR.Store(lo.ToPtr("10.100.0.0/16"))
ExpectApplied(ctx, env.Client, nodePool, nodeClass)
pod := coretest.UnschedulablePod()
ExpectProvisioned(ctx, env.Client, cluster, cloudProvider, prov, pod)
Expand Down
1 change: 0 additions & 1 deletion pkg/providers/instancetype/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,6 @@ func memory(ctx context.Context, info *ec2.InstanceTypeInfo) *resource.Quantity
}

// Setting ephemeral-storage to be either the default value, what is defined in blockDeviceMappings, or the combined size of local store volumes.
// nolint:gocyclo
func ephemeralStorage(info *ec2.InstanceTypeInfo, amiFamily amifamily.AMIFamily, nodeClass *v1beta1.EC2NodeClass) *resource.Quantity {
// If local store disks have been configured for node ephemeral-storage, use the total size of the disks.
if lo.FromPtr(nodeClass.Spec.InstanceStorePolicy) == v1beta1.InstanceStorePolicyRAID0 {
Expand Down
15 changes: 8 additions & 7 deletions pkg/providers/launchtemplate/launchtemplate.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import (
"net"
"strings"
"sync"
"sync/atomic"
"time"

"go.uber.org/multierr"
Expand Down Expand Up @@ -76,7 +77,7 @@ type Provider struct {
KubeDNSIP net.IP
CABundle *string
ClusterEndpoint string
ClusterCIDR *string
ClusterCIDR atomic.Pointer[string]
}

func NewProvider(ctx context.Context, cache *cache.Cache, ec2api ec2iface.EC2API, eksapi eksiface.EKSAPI, amiFamily *amifamily.Resolver,
Expand Down Expand Up @@ -177,7 +178,7 @@ func (p *Provider) createAMIOptions(ctx context.Context, nodeClass *v1beta1.EC2N
options := &amifamily.Options{
ClusterName: options.FromContext(ctx).ClusterName,
ClusterEndpoint: p.ClusterEndpoint,
ClusterCIDR: p.ClusterCIDR,
ClusterCIDR: p.ClusterCIDR.Load(),
InstanceProfile: instanceProfile,
InstanceStorePolicy: nodeClass.Spec.InstanceStorePolicy,
SecurityGroups: lo.Map(securityGroups, func(s *ec2.SecurityGroup, _ int) v1beta1.SecurityGroup {
Expand Down Expand Up @@ -432,24 +433,24 @@ func (p *Provider) DeleteLaunchTemplates(ctx context.Context, nodeClass *v1beta1
}

func (p *Provider) ResolveClusterCIDR(ctx context.Context) error {
if p.ClusterCIDR != nil {
if p.ClusterCIDR.Load() != nil {
return nil
}
out, err := p.eksapi.DescribeClusterWithContext(ctx, &eks.DescribeClusterInput{
Name: aws.String(options.FromContext(ctx).ClusterName),
})
if err != nil {
return fmt.Errorf("resolving cluster CIDR, %w", err)
return cloudprovider.NewNodeClassNotReadyError(fmt.Errorf("resolving cluster CIDR, %w", err))
}
if ipv4CIDR := out.Cluster.KubernetesNetworkConfig.ServiceIpv4Cidr; ipv4CIDR != nil {
p.ClusterCIDR = ipv4CIDR
p.ClusterCIDR.Store(ipv4CIDR)
logging.FromContext(ctx).With("cluster-cidr", *ipv4CIDR).Debugf("discovered cluster CIDR")
return nil
}
if ipv6CIDR := out.Cluster.KubernetesNetworkConfig.ServiceIpv6Cidr; ipv6CIDR != nil {
logging.FromContext(ctx).With("cluster-cidr", *ipv6CIDR).Debugf("discovered cluster CIDR")
p.ClusterCIDR = ipv6CIDR
p.ClusterCIDR.Store(ipv6CIDR)
return nil
}
return fmt.Errorf("resolving cluster CIDR, no CIDR found in DescribeCluster response")
return cloudprovider.NewNodeClassNotReadyError(fmt.Errorf("resolving cluster CIDR, no CIDR found in DescribeCluster response"))
}
62 changes: 27 additions & 35 deletions pkg/providers/launchtemplate/suite_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -423,7 +423,7 @@ var _ = Describe("LaunchTemplates", func() {
It("should default AL2023 block device mappings", func() {
nodeClass.Spec.AMIFamily = &v1beta1.AMIFamilyAL2023
awsEnv.LaunchTemplateProvider.CABundle = lo.ToPtr("Y2EtYnVuZGxlCg==")
awsEnv.LaunchTemplateProvider.ClusterCIDR = lo.ToPtr("10.100.0.0/16")
awsEnv.LaunchTemplateProvider.ClusterCIDR.Store(lo.ToPtr("10.100.0.0/16"))
ExpectApplied(ctx, env.Client, nodePool, nodeClass)
pod := coretest.UnschedulablePod()
ExpectProvisioned(ctx, env.Client, cluster, cloudProvider, prov, pod)
Expand Down Expand Up @@ -1154,7 +1154,7 @@ var _ = Describe("LaunchTemplates", func() {
ExpectScheduled(ctx, env.Client, pod)
content, err = os.ReadFile("testdata/br_userdata_merged.golden")
Expect(err).To(BeNil())
ExpectLaunchTemplatesCreatedWithUserData(fmt.Sprintf(string(content), corev1beta1.NodePoolLabelKey, nodePool.Name))
ExpectLaunchTemplatesCreatedWithUserDataMatching(fmt.Sprintf(string(content), corev1beta1.NodePoolLabelKey, nodePool.Name))
})
It("should bootstrap when custom user data is empty", func() {
nodePool.Spec.Template.Spec.Taints = []v1.Taint{{Key: "foo", Value: "bar", Effect: v1.TaintEffectNoExecute}}
Expand All @@ -1168,7 +1168,7 @@ var _ = Describe("LaunchTemplates", func() {
ExpectScheduled(ctx, env.Client, pod)
content, err := os.ReadFile("testdata/br_userdata_unmerged.golden")
Expect(err).To(BeNil())
ExpectLaunchTemplatesCreatedWithUserData(fmt.Sprintf(string(content), corev1beta1.NodePoolLabelKey, nodePool.Name))
ExpectLaunchTemplatesCreatedWithUserDataMatching(fmt.Sprintf(string(content), corev1beta1.NodePoolLabelKey, nodePool.Name))
})
It("should not bootstrap when provider ref points to a non-existent EC2NodeClass resource", func() {
nodePool.Spec.Template.Spec.NodeClassRef = &corev1beta1.NodeClassReference{Name: "doesnotexist"}
Expand Down Expand Up @@ -1368,7 +1368,7 @@ var _ = Describe("LaunchTemplates", func() {
content, err = os.ReadFile("testdata/al2_userdata_merged.golden")
Expect(err).To(BeNil())
expectedUserData := fmt.Sprintf(string(content), corev1beta1.NodePoolLabelKey, nodePool.Name)
ExpectLaunchTemplatesCreatedWithUserData(expectedUserData)
ExpectLaunchTemplatesCreatedWithUserDataMatching(expectedUserData)
})
It("should merge in custom user data when Content-Type is before MIME-Version", func() {
content, err := os.ReadFile("testdata/al2_userdata_content_type_first_input.golden")
Expand All @@ -1381,7 +1381,7 @@ var _ = Describe("LaunchTemplates", func() {
content, err = os.ReadFile("testdata/al2_userdata_merged.golden")
Expect(err).To(BeNil())
expectedUserData := fmt.Sprintf(string(content), corev1beta1.NodePoolLabelKey, nodePool.Name)
ExpectLaunchTemplatesCreatedWithUserData(expectedUserData)
ExpectLaunchTemplatesCreatedWithUserDataMatching(expectedUserData)
})
It("should merge in custom user data not in multi-part mime format", func() {
content, err := os.ReadFile("testdata/al2_no_mime_userdata_input.golden")
Expand All @@ -1394,7 +1394,7 @@ var _ = Describe("LaunchTemplates", func() {
content, err = os.ReadFile("testdata/al2_userdata_merged.golden")
Expect(err).To(BeNil())
expectedUserData := fmt.Sprintf(string(content), corev1beta1.NodePoolLabelKey, nodePool.Name)
ExpectLaunchTemplatesCreatedWithUserData(expectedUserData)
ExpectLaunchTemplatesCreatedWithUserDataMatching(expectedUserData)
})
It("should handle empty custom user data", func() {
nodeClass.Spec.UserData = nil
Expand All @@ -1405,7 +1405,7 @@ var _ = Describe("LaunchTemplates", func() {
content, err := os.ReadFile("testdata/al2_userdata_unmerged.golden")
Expect(err).To(BeNil())
expectedUserData := fmt.Sprintf(string(content), corev1beta1.NodePoolLabelKey, nodePool.Name)
ExpectLaunchTemplatesCreatedWithUserData(expectedUserData)
ExpectLaunchTemplatesCreatedWithUserDataMatching(expectedUserData)
})
})
Context("AL2023", func() {
Expand All @@ -1414,7 +1414,7 @@ var _ = Describe("LaunchTemplates", func() {

// base64 encoded version of "ca-bundle" to ensure the nodeadm bootstrap provider can decode successfully
awsEnv.LaunchTemplateProvider.CABundle = lo.ToPtr("Y2EtYnVuZGxlCg==")
awsEnv.LaunchTemplateProvider.ClusterCIDR = lo.ToPtr("10.100.0.0/16")
awsEnv.LaunchTemplateProvider.ClusterCIDR.Store(lo.ToPtr("10.100.0.0/16"))
})
Context("Kubelet", func() {
It("should specify taints in the KubeletConfiguration when specified in NodePool", func() {
Expand All @@ -1437,7 +1437,7 @@ var _ = Describe("LaunchTemplates", func() {
}))
ExpectProvisioned(ctx, env.Client, cluster, cloudProvider, prov, pod)
ExpectScheduled(ctx, env.Client, pod)
ExpectLaunchTemplatesCreatedWithUserDataF(func(userData string) {
for _, userData := range ExpectLaunchTemplatesCreatedWithUserData() {
configs := ExpectUserDataCreatedWithNodeConfigs(userData)
Expect(len(configs)).To(Equal(1))
taintsRaw, ok := configs[0].Spec.Kubelet.Config["registerWithTaints"]
Expand All @@ -1448,7 +1448,7 @@ var _ = Describe("LaunchTemplates", func() {
Expect(taints).To(ContainElements(lo.Map(desiredTaints, func(t v1.Taint, _ int) interface{} {
return interface{}(t)
})))
})
}
})
It("should specify labels in the Kubelet flags when specified in NodePool", func() {
desiredLabels := map[string]string{
Expand All @@ -1461,8 +1461,7 @@ var _ = Describe("LaunchTemplates", func() {
pod := coretest.UnschedulablePod()
ExpectProvisioned(ctx, env.Client, cluster, cloudProvider, prov, pod)
ExpectScheduled(ctx, env.Client, pod)

ExpectLaunchTemplatesCreatedWithUserDataF(func(userData string) {
for _, userData := range ExpectLaunchTemplatesCreatedWithUserData() {
configs := ExpectUserDataCreatedWithNodeConfigs(userData)
Expect(len(configs)).To(Equal(1))
labelFlag, ok := lo.Find(configs[0].Spec.Kubelet.Flags, func(flag string) bool {
Expand All @@ -1472,7 +1471,7 @@ var _ = Describe("LaunchTemplates", func() {
for label, value := range desiredLabels {
Expect(labelFlag).To(ContainSubstring(fmt.Sprintf("%s=%s", label, value)))
}
})
}
})
DescribeTable(
"should specify KubletConfiguration field when specified in NodePool",
Expand All @@ -1495,11 +1494,11 @@ var _ = Describe("LaunchTemplates", func() {
return runtime.RawExtension{Raw: val}
})
}()
ExpectLaunchTemplatesCreatedWithUserDataF(func(ud string) {
configs := ExpectUserDataCreatedWithNodeConfigs(ud)
for _, userData := range ExpectLaunchTemplatesCreatedWithUserData() {
configs := ExpectUserDataCreatedWithNodeConfigs(userData)
Expect(len(configs)).To(Equal(1))
Expect(configs[0].Spec.Kubelet.Config[field]).To(Equal(inlineConfig[field]))
})
}
},
Entry("systemReserved", "systemReserved", corev1beta1.KubeletConfiguration{
SystemReserved: v1.ResourceList{
Expand Down Expand Up @@ -1572,11 +1571,11 @@ var _ = Describe("LaunchTemplates", func() {
pod := coretest.UnschedulablePod()
ExpectProvisioned(ctx, env.Client, cluster, cloudProvider, prov, pod)
ExpectScheduled(ctx, env.Client, pod)
ExpectLaunchTemplatesCreatedWithUserDataF(func(ud string) {
configs := ExpectUserDataCreatedWithNodeConfigs(ud)
for _, userData := range ExpectLaunchTemplatesCreatedWithUserData() {
configs := ExpectUserDataCreatedWithNodeConfigs(userData)
Expect(len(configs)).To(Equal(1))
Expect(configs[0].Spec.Instance.LocalStorage.Strategy).To(Equal(admv1alpha1.LocalStorageRAID0))
})
}
})
DescribeTable(
"should merge custom user data",
Expand All @@ -1594,21 +1593,13 @@ var _ = Describe("LaunchTemplates", func() {
content, err := os.ReadFile("testdata/" + mergedFile)
Expect(err).To(BeNil())
expectedUserData := fmt.Sprintf(string(content), corev1beta1.NodePoolLabelKey, nodePool.Name)
ExpectLaunchTemplatesCreatedWithUserData(expectedUserData)
ExpectLaunchTemplatesCreatedWithUserDataMatching(expectedUserData)
},
Entry("MIME", lo.ToPtr("al2023_mime_userdata_input.golden"), "al2023_mime_userdata_merged.golden"),
Entry("YAML", lo.ToPtr("al2023_yaml_userdata_input.golden"), "al2023_yaml_userdata_merged.golden"),
Entry("shell", lo.ToPtr("al2023_shell_userdata_input.golden"), "al2023_shell_userdata_merged.golden"),
Entry("empty", nil, "al2023_userdata_unmerged.golden"),
)
It("should fail to create launch templates if cluster CIDR is unresolved", func() {
awsEnv.LaunchTemplateProvider.ClusterCIDR = nil
ExpectApplied(ctx, env.Client, nodeClass, nodePool)
pod := coretest.UnschedulablePod()
ExpectProvisioned(ctx, env.Client, cluster, cloudProvider, prov, pod)
ExpectNotScheduled(ctx, env.Client, pod)
Expect(awsEnv.EC2API.CalledWithCreateLaunchTemplateInput.Len()).To(Equal(0))
})
})
Context("Custom AMI Selector", func() {
It("should use ami selector specified in EC2NodeClass", func() {
Expand Down Expand Up @@ -1646,7 +1637,7 @@ var _ = Describe("LaunchTemplates", func() {
pod := coretest.UnschedulablePod()
ExpectProvisioned(ctx, env.Client, cluster, cloudProvider, prov, pod)
ExpectScheduled(ctx, env.Client, pod)
ExpectLaunchTemplatesCreatedWithUserData("special user data")
ExpectLaunchTemplatesCreatedWithUserDataMatching("special user data")
})
It("should correctly use ami selector with specific IDs in EC2NodeClass", func() {
nodeClass.Spec.AMISelectorTerms = []v1beta1.AMISelectorTerm{{ID: "ami-123"}, {ID: "ami-456"}}
Expand Down Expand Up @@ -1870,7 +1861,7 @@ var _ = Describe("LaunchTemplates", func() {
ExpectScheduled(ctx, env.Client, pod)
content, err = os.ReadFile("testdata/windows_userdata_merged.golden")
Expect(err).To(BeNil())
ExpectLaunchTemplatesCreatedWithUserData(fmt.Sprintf(string(content), corev1beta1.NodePoolLabelKey, nodePool.Name))
ExpectLaunchTemplatesCreatedWithUserDataMatching(fmt.Sprintf(string(content), corev1beta1.NodePoolLabelKey, nodePool.Name))
})
It("should bootstrap when custom user data is empty", func() {
ExpectApplied(ctx, env.Client, nodeClass, nodePool)
Expand All @@ -1885,7 +1876,7 @@ var _ = Describe("LaunchTemplates", func() {
ExpectScheduled(ctx, env.Client, pod)
content, err := os.ReadFile("testdata/windows_userdata_unmerged.golden")
Expect(err).To(BeNil())
ExpectLaunchTemplatesCreatedWithUserData(fmt.Sprintf(string(content), corev1beta1.NodePoolLabelKey, nodePool.Name))
ExpectLaunchTemplatesCreatedWithUserDataMatching(fmt.Sprintf(string(content), corev1beta1.NodePoolLabelKey, nodePool.Name))
})
})
})
Expand Down Expand Up @@ -1960,28 +1951,29 @@ func ExpectLaunchTemplatesCreatedWithUserDataNotContaining(substrings ...string)
})
}

func ExpectLaunchTemplatesCreatedWithUserData(expected string) {
func ExpectLaunchTemplatesCreatedWithUserDataMatching(expected string) {
GinkgoHelper()
Expect(awsEnv.EC2API.CalledWithCreateLaunchTemplateInput.Len()).To(BeNumerically(">=", 1))
awsEnv.EC2API.CalledWithCreateLaunchTemplateInput.ForEach(func(input *ec2.CreateLaunchTemplateInput) {
userData, err := base64.StdEncoding.DecodeString(*input.LaunchTemplateData.UserData)
ExpectWithOffset(2, err).To(BeNil())
// Newlines are always added for missing TOML fields, so strip them out before comparisons.
fmt.Print(string(userData))
actualUserData := strings.Replace(string(userData), "\n", "", -1)
expectedUserData := strings.Replace(expected, "\n", "", -1)
ExpectWithOffset(2, actualUserData).To(Equal(expectedUserData))
})
}

func ExpectLaunchTemplatesCreatedWithUserDataF(fn func(userData string)) {
func ExpectLaunchTemplatesCreatedWithUserData() []string {
GinkgoHelper()
Expect(awsEnv.EC2API.CalledWithCreateLaunchTemplateInput.Len()).To(BeNumerically(">=", 1))
userDatas := []string{}
awsEnv.EC2API.CalledWithCreateLaunchTemplateInput.ForEach(func(input *ec2.CreateLaunchTemplateInput) {
userData, err := base64.StdEncoding.DecodeString(*input.LaunchTemplateData.UserData)
ExpectWithOffset(2, err).To(BeNil())
fn(string(userData))
userDatas = append(userDatas, string(userData))
})
return userDatas
}

func ExpectUserDataCreatedWithNodeConfigs(userData string) []admv1alpha1.NodeConfig {
Expand Down

0 comments on commit c439ea5

Please sign in to comment.