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
3 changes: 3 additions & 0 deletions v1/providers/testkube/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ const (
servicePortName = "ssh"
servicePort = int32(22)
containerSSHPort = int32(22)

nestedContainerSSHPortName = "container-ssh"
nestedContainerSSHPort = int32(2222)
)

type TestKubeAuthMode string
Expand Down
44 changes: 34 additions & 10 deletions v1/providers/testkube/instance.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ func (c *TestKubeClient) CreateInstance(ctx context.Context, attrs cloudv1.Creat
return instance, nil
}

func (c *TestKubeClient) createInstanceAsK8sResources(ctx context.Context, attrs cloudv1.CreateInstanceAttrs, instanceTypeSpec instanceTypeSpec) (*cloudv1.Instance, error) {
func (c *TestKubeClient) createInstanceAsK8sResources(ctx context.Context, attrs cloudv1.CreateInstanceAttrs, instanceTypeSpec instanceTypeSpec) (*cloudv1.Instance, error) { //nolint:funlen // ok
// Create a "cloud ID" to emulate a provider-provided instance ID.
cloudID := makeCloudID(c.refID, attrs.RefID)

Expand All @@ -90,6 +90,20 @@ func (c *TestKubeClient) createInstanceAsK8sResources(ctx context.Context, attrs
} else {
serviceAnnotations = annotations
}
servicePorts := []corev1.ServicePort{
{
Name: servicePortName,
Protocol: corev1.ProtocolTCP,
Port: servicePort,
TargetPort: intstr.FromInt32(containerSSHPort),
},
{
Name: nestedContainerSSHPortName,
Protocol: corev1.ProtocolTCP,
Port: nestedContainerSSHPort,
TargetPort: intstr.FromInt32(nestedContainerSSHPort),
},
}

// Create the service.
k8sService, err := c.k8sClient.
Expand All @@ -105,14 +119,7 @@ func (c *TestKubeClient) createInstanceAsK8sResources(ctx context.Context, attrs
Spec: corev1.ServiceSpec{
Type: instanceTypeSpec.serviceType,
Selector: selectorLabels(string(cloudID)),
Ports: []corev1.ServicePort{
{
Name: servicePortName,
Protocol: corev1.ProtocolTCP,
Port: servicePort,
TargetPort: intstr.FromInt32(containerSSHPort),
},
},
Ports: servicePorts,
},
}, metav1.CreateOptions{})
if err != nil {
Expand Down Expand Up @@ -413,6 +420,15 @@ func populateNetwork(service *corev1.Service, hostIP string, instance *cloudv1.I
}
// Set the SSH port to the first node port.
instance.SSHPort = int(service.Spec.Ports[0].NodePort)
for _, port := range service.Spec.Ports[1:] {
if port.NodePort == 0 {
continue
}
instance.InternalPortMappings = append(instance.InternalPortMappings, cloudv1.PortMapping{
FromPort: int(port.Port),
ToPort: int(port.NodePort),
})
}
if hostIP != "" {
instance.PublicIP = hostIP
instance.PublicDNS = hostIP
Expand Down Expand Up @@ -463,7 +479,15 @@ func statusFromResources(pod *corev1.Pod, service *corev1.Service) cloudv1.Statu
}

func nodePortReady(pod *corev1.Pod, service *corev1.Service) bool {
return pod.Status.HostIP != "" && len(service.Spec.Ports) > 0 && service.Spec.Ports[0].NodePort != 0
if pod.Status.HostIP == "" || len(service.Spec.Ports) == 0 {
return false
}
for _, port := range service.Spec.Ports {
if port.NodePort == 0 {
return false
}
}
return true
}

func loadBalancerReady(service *corev1.Service) bool {
Expand Down
17 changes: 16 additions & 1 deletion v1/providers/testkube/instance_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ func TestInstanceLifecycle(t *testing.T) { //nolint:funlen // ok
service, err := client.k8sClient.CoreV1().Services(client.namespace).Get(ctx, string(instance.CloudID), metav1.GetOptions{})
require.NoError(t, err)
require.Equal(t, awsLoadBalancerConnectionIdleTimeout, service.Annotations[annotationAWSLoadBalancerConnectionIdleTimeout])
require.Len(t, service.Spec.Ports, 2)
pod, err := client.k8sClient.CoreV1().Pods(client.namespace).Get(ctx, string(instance.CloudID), metav1.GetOptions{})
require.NoError(t, err)
require.NotContains(t, pod.Annotations, annotationAWSLoadBalancerConnectionIdleTimeout)
Expand Down Expand Up @@ -138,6 +139,7 @@ func TestNodePortInstanceLifecycle(t *testing.T) {
require.NoError(t, err)
require.Equal(t, corev1.ServiceTypeNodePort, service.Spec.Type)
require.NotContains(t, service.Annotations, annotationAWSLoadBalancerConnectionIdleTimeout)
require.Len(t, service.Spec.Ports, 2)
service.Spec.Ports[0].NodePort = 32421
_, err = client.k8sClient.CoreV1().Services(client.namespace).Update(ctx, service, metav1.UpdateOptions{})
require.NoError(t, err)
Expand All @@ -150,12 +152,21 @@ func TestNodePortInstanceLifecycle(t *testing.T) {
_, err = client.k8sClient.CoreV1().Pods(client.namespace).UpdateStatus(ctx, pod, metav1.UpdateOptions{})
require.NoError(t, err)

pending, err := client.GetInstance(ctx, instance.CloudID)
require.NoError(t, err)
require.Equal(t, cloudv1.LifecycleStatusPending, pending.Status.LifecycleStatus)

service.Spec.Ports[1].NodePort = 32422
_, err = client.k8sClient.CoreV1().Services(client.namespace).Update(ctx, service, metav1.UpdateOptions{})
require.NoError(t, err)

running, err := client.GetInstance(ctx, instance.CloudID)
require.NoError(t, err)
require.Equal(t, cloudv1.LifecycleStatusRunning, running.Status.LifecycleStatus)
require.Equal(t, "192.168.49.2", running.PublicIP)
require.Equal(t, "192.168.49.2", running.PublicDNS)
require.Equal(t, 32421, running.SSHPort)
require.Equal(t, []cloudv1.PortMapping{{FromPort: 2222, ToPort: 32422}}, running.InternalPortMappings)
}

func TestScenarioEnvironment(t *testing.T) {
Expand Down Expand Up @@ -304,14 +315,18 @@ func TestPopulateNetworkNodePort(t *testing.T) {
Spec: corev1.ServiceSpec{
Type: corev1.ServiceTypeNodePort,
ClusterIP: "10.96.119.41",
Ports: []corev1.ServicePort{{Port: 22, NodePort: 32421}},
Ports: []corev1.ServicePort{
{Port: 22, NodePort: 32421},
{Port: 2222, NodePort: 32422},
},
},
}, "192.168.49.2", instance)

require.Equal(t, "10.96.119.41", instance.PrivateIP)
require.Equal(t, "192.168.49.2", instance.PublicIP)
require.Equal(t, "192.168.49.2", instance.PublicDNS)
require.Equal(t, 32421, instance.SSHPort)
require.Equal(t, []cloudv1.PortMapping{{FromPort: 2222, ToPort: 32422}}, instance.InternalPortMappings)
}

func setPodReady(t *testing.T, client *TestKubeClient, instanceID cloudv1.CloudProviderInstanceID) {
Expand Down
Loading