Skip to content

Commit

Permalink
WIP Enable baremetal deployment with virtualmedia
Browse files Browse the repository at this point in the history
  • Loading branch information
rabi committed Nov 23, 2023
1 parent 29e3949 commit 6f55172
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 58 deletions.
58 changes: 36 additions & 22 deletions controllers/openstackprovisionserver_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,12 @@ import (
rbacv1 "k8s.io/api/rbac/v1"
k8s_errors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
k8s_labels "k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/client-go/dynamic"
"k8s.io/client-go/kubernetes"
"k8s.io/utils/strings/slices"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/client/config"
Expand Down Expand Up @@ -339,7 +341,12 @@ func (r *OpenStackProvisionServerReconciler) reconcileNormal(ctx context.Context
err.Error()))
return ctrl.Result{}, err
}
instance.Status.Conditions.MarkTrue(baremetalv1.OpenStackProvisionServerProvIntfReadyCondition, baremetalv1.OpenStackProvisionServerProvIntfReadyMessage)

if provInterfaceName != "" {
instance.Status.Conditions.MarkTrue(baremetalv1.OpenStackProvisionServerProvIntfReadyCondition, baremetalv1.OpenStackProvisionServerProvIntfReadyMessage)
} else {
instance.Status.Conditions.Remove(baremetalv1.OpenStackProvisionServerProvIntfReadyCondition)
}

serviceLabels := labels.GetLabels(instance, openstackprovisionserver.AppLabel, map[string]string{
common.AppSelector: instance.Name + "-deployment",
Expand Down Expand Up @@ -416,22 +423,14 @@ func (r *OpenStackProvisionServerReconciler) reconcileNormal(ctx context.Context
}
// create Deployment - end

//
// Check whether instance.Status.ProvisionIp has been set by the side-car agent container
// that is created with the deployment above and generate the LocalImageURL if so
//
// Provision IP Discovery Agent sets status' ProvisionIP
if instance.Status.ProvisionIP == "" {
instance.Status.Conditions.Set(condition.FalseCondition(
baremetalv1.OpenStackProvisionServerLocalImageURLReadyCondition,
condition.RequestedReason,
condition.SeverityInfo,
baremetalv1.OpenStackProvisionServerLocalImageURLReadyRunningMessage))
return ctrlResult, nil
instance.Status.LocalImageURL, err = r.getLocalImageURL(ctx, helper, instance)
if err != nil {
instance.Status.Conditions.MarkFalse(
baremetalv1.OpenStackProvisionServerLocalImageURLReadyCondition, condition.ErrorReason, condition.SeverityError,
baremetalv1.OpenStackBaremetalSetBmhProvisioningReadyErrorMessage, err.Error())
return ctrl.Result{}, err
}

instance.Status.LocalImageURL = r.getLocalImageURL(instance)

if oldLocalImageURL != instance.Status.LocalImageURL {
r.Log.Info(fmt.Sprintf("OpenStackProvisionServer LocalImageURL changed: %s", instance.Status.LocalImageURL))
}
Expand Down Expand Up @@ -525,10 +524,6 @@ func (r *OpenStackProvisionServerReconciler) getProvisioningInterfaceName(
if err != nil {
return "", err
}

if provInterfaceName == "" {
return "", fmt.Errorf("metal3 provisioning interface configuration not found")
}
}

return provInterfaceName, nil
Expand Down Expand Up @@ -560,9 +555,14 @@ func (r *OpenStackProvisionServerReconciler) getProvisioningInterface(

provisioningSpecIntf := provisioning.Object["spec"]

noPorvNetwork := []string{"Disabled", "Unmanaged"}
if provisioningSpec, ok := provisioningSpecIntf.(map[string]interface{}); ok {
interfaceIntf := provisioningSpec["provisioningInterface"]
provNetwork := provisioningSpec["provisioningNetwork"]
if !slices.Contains(noPorvNetwork, provNetwork.(string)) {
return "", nil
}

interfaceIntf := provisioningSpec["provisioningInterface"]
if provInterfaceName, ok := interfaceIntf.(string); ok {
r.Log.Info(fmt.Sprintf("Found provisioning interface %s in Metal3 config", provInterfaceName))
return provInterfaceName, nil
Expand All @@ -572,7 +572,21 @@ func (r *OpenStackProvisionServerReconciler) getProvisioningInterface(
return "", nil
}

func (r *OpenStackProvisionServerReconciler) getLocalImageURL(instance *baremetalv1.OpenStackProvisionServer) string {
func (r *OpenStackProvisionServerReconciler) getLocalImageURL(
ctx context.Context, helper *helper.Helper, instance *baremetalv1.OpenStackProvisionServer) (string, error) {
baseFilename := instance.Spec.OSImage
return fmt.Sprintf("http://%s:%d/%s", instance.Status.ProvisionIP, instance.Spec.Port, baseFilename)
host := instance.Status.ProvisionIP
if host == "" {
serviceLabels := labels.GetLabels(instance, openstackprovisionserver.AppLabel, map[string]string{
common.AppSelector: instance.Name + "-deployment"})
podSelectorString := k8s_labels.Set(serviceLabels).String()
// Get the pod for provisionserver
provisionPods, err := helper.GetKClient().CoreV1().Pods(
instance.Namespace).List(ctx, metav1.ListOptions{LabelSelector: podSelectorString})
if err != nil {
return "", err
}
host = provisionPods.Items[0].Status.HostIP
}
return fmt.Sprintf("http://%s:%d/%s", host, instance.Spec.Port, baseFilename), nil
}
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ require (
k8s.io/api v0.26.10
k8s.io/apimachinery v0.26.10
k8s.io/client-go v0.26.10
k8s.io/utils v0.0.0-20230726121419-3b25d923346b
sigs.k8s.io/controller-runtime v0.14.6
)

Expand Down Expand Up @@ -73,7 +74,6 @@ require (
k8s.io/component-base v0.26.10 // indirect
k8s.io/klog/v2 v2.100.1 // indirect
k8s.io/kube-openapi v0.0.0-20230308215209-15aac26d736a // indirect
k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect
sigs.k8s.io/yaml v1.3.0 // indirect
Expand Down
76 changes: 41 additions & 35 deletions pkg/openstackprovisionserver/deployment.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,46 @@ func Deployment(

replicas := int32(1)

containers := []corev1.Container{
{
Name: "osp-httpd",
Command: []string{
"/bin/bash",
},
Args: args,
Image: instance.Spec.ApacheImageURL,
VolumeMounts: getVolumeMounts(),
Resources: instance.Spec.Resources,
StartupProbe: startupProbe,
ReadinessProbe: readinessProbe,
LivenessProbe: livenessProbe,
},
}

if provInterfaceName != "" {
discoveryContainer := corev1.Container{
Name: "osp-provision-ip-discovery-agent",
Command: []string{"/openstack-baremetal-agent", "provision-ip-discovery"},
Image: instance.Spec.AgentImageURL,
ImagePullPolicy: corev1.PullAlways,
Env: []corev1.EnvVar{
{
Name: "PROV_INTF",
Value: provInterfaceName,
},
{
Name: "PROV_SERVER_NAME",
Value: instance.GetName(),
},
{
Name: "PROV_SERVER_NAMESPACE",
Value: instance.GetNamespace(),
},
},
}
containers = append(containers, discoveryContainer)
}

deployment := &appsv1.Deployment{
ObjectMeta: metav1.ObjectMeta{
Name: fmt.Sprintf("%s-openstackprovisionserver", instance.Name),
Expand All @@ -106,41 +146,7 @@ func Deployment(
Spec: corev1.PodSpec{
ServiceAccountName: instance.RbacResourceName(),
HostNetwork: true,
Containers: []corev1.Container{
{
Name: "osp-httpd",
Command: []string{
"/bin/bash",
},
Args: args,
Image: instance.Spec.ApacheImageURL,
VolumeMounts: getVolumeMounts(),
Resources: instance.Spec.Resources,
StartupProbe: startupProbe,
ReadinessProbe: readinessProbe,
LivenessProbe: livenessProbe,
},
{
Name: "osp-provision-ip-discovery-agent",
Command: []string{"/openstack-baremetal-agent", "provision-ip-discovery"},
Image: instance.Spec.AgentImageURL,
ImagePullPolicy: corev1.PullAlways,
Env: []corev1.EnvVar{
{
Name: "PROV_INTF",
Value: provInterfaceName,
},
{
Name: "PROV_SERVER_NAME",
Value: instance.GetName(),
},
{
Name: "PROV_SERVER_NAMESPACE",
Value: instance.GetNamespace(),
},
},
},
},
Containers: containers,
},
},
},
Expand Down

0 comments on commit 6f55172

Please sign in to comment.