Skip to content

Commit dcbe555

Browse files
committed
Adds notification transporturl
1 parent 68bd304 commit dcbe555

7 files changed

Lines changed: 154 additions & 76 deletions

File tree

api/v1beta1/conditions.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,10 @@ const (
5252
NovaComputeServiceConfigReady condition.Type = "NovaComputeServiceConfigReady"
5353
// NovaAllControlPlaneComputesReadyCondition indicates that every defined NovaCompute is ready but undiscovered
5454
NovaAllControlPlaneComputesReadyCondition condition.Type = "NovaAllControlPlaneComputesReady"
55+
56+
// notifications
57+
// NovaNotificationMQReadyCondition indicated that the top level notification message bus is ready
58+
NovaNotificationMQReadyCondition condition.Type = "NovaNotificationMQReady"
5559
)
5660

5761
// Common Messages used by API objects.
@@ -172,4 +176,14 @@ const (
172176

173177
//CellHostDiscoverErrorMessage
174178
CellHostDiscoverErrorMessage = "CellHostDiscover error occurred %s"
179+
180+
// notifications
181+
// NovaNotificationMQReadyErrorMessage
182+
NovaNotificationMQReadyErrorMessage = "Notification message bus creation failed: %s"
183+
184+
// NovaNotificationMQReadyCreatingMessage
185+
NovaNotificationMQReadyCreatingMessage = "Notification message bus creation ongoing"
186+
187+
// NovaNotificationMQReadyMessage
188+
NovaNotificationMQReadyMessage = "Notification message bus creation successfully"
175189
)

controllers/common.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,8 @@ const (
9494
MetadataSecretSelector = "MetadataSecret"
9595
// TransportURLSelector is the name of key in the internal cell
9696
// Secret for the cell message bus transport URL
97-
TransportURLSelector = "transport_url"
97+
TransportURLSelector = "transport_url"
98+
NotificationTransportURLSelector = "notificaton_transport_url"
9899

99100
// fields to index to reconcile when change
100101
passwordSecretField = ".spec.secret"

controllers/nova_controller.go

Lines changed: 61 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,45 @@ func (r *NovaReconciler) Reconcile(ctx context.Context, req ctrl.Request) (resul
384384
return ctrl.Result{}, fmt.Errorf("%w from for the API MQ: %d", util.ErrInvalidStatus, apiMQStatus)
385385
}
386386

387+
// nova broadcaster rabbit
388+
notificationBusName := ""
389+
if instance.Spec.NotificationsBusInstance != nil {
390+
notificationBusName = *instance.Spec.NotificationsBusInstance
391+
}
392+
393+
var notificationTransportURL string
394+
var notificationMQStatus nova.MessageBusStatus
395+
var notificationMQError error
396+
397+
if notificationBusName != "" {
398+
notificationTransportURL, notificationMQStatus, notificationMQError = r.ensureMQ(
399+
ctx, h, instance, instance.Name+"-notification-transport", notificationBusName)
400+
401+
switch notificationMQStatus {
402+
case nova.MQFailed:
403+
instance.Status.Conditions.Set(condition.FalseCondition(
404+
novav1.NovaNotificationMQReadyCondition,
405+
condition.ErrorReason,
406+
condition.SeverityError,
407+
novav1.NovaNotificationMQReadyErrorMessage,
408+
notificationMQError.Error(),
409+
))
410+
case nova.MQCreating:
411+
instance.Status.Conditions.Set(condition.FalseCondition(
412+
novav1.NovaNotificationMQReadyCondition,
413+
condition.ErrorReason,
414+
condition.SeverityError,
415+
novav1.NovaNotificationMQReadyCreatingMessage,
416+
))
417+
case nova.MQCompleted:
418+
instance.Status.Conditions.MarkTrue(
419+
novav1.NovaNotificationMQReadyCondition, novav1.NovaNotificationMQReadyMessage)
420+
default:
421+
return ctrl.Result{}, fmt.Errorf("%w from for the Notification MQ: %d",
422+
util.ErrInvalidStatus, notificationMQStatus)
423+
}
424+
}
425+
387426
cellMQs := map[string]*nova.MessageBus{}
388427
var failedMQs []string
389428
var creatingMQs []string
@@ -474,7 +513,7 @@ func (r *NovaReconciler) Reconcile(ctx context.Context, req ctrl.Request) (resul
474513
}
475514
cell, status, err := r.ensureCell(
476515
ctx, h, instance, cellName, cellTemplate,
477-
cellDB.Database, apiDB, cellMQ.TransportURL,
516+
cellDB.Database, apiDB, cellMQ.TransportURL, notificationTransportURL,
478517
keystoneInternalAuthURL, secret,
479518
)
480519
cells[cellName] = cell
@@ -539,7 +578,11 @@ func (r *NovaReconciler) Reconcile(ctx context.Context, req ctrl.Request) (resul
539578
return ctrl.Result{}, nil
540579
}
541580

542-
topLevelSecretName, err := r.ensureTopLevelSecret(ctx, h, instance, apiTransportURL, secret)
581+
topLevelSecretName, err := r.ensureTopLevelSecret(
582+
ctx, h, instance,
583+
apiTransportURL,
584+
notificationTransportURL,
585+
secret)
543586
if err != nil {
544587
return ctrl.Result{}, err
545588
}
@@ -1100,12 +1143,16 @@ func (r *NovaReconciler) ensureCell(
11001143
cellDB *mariadbv1.Database,
11011144
apiDB *mariadbv1.Database,
11021145
cellTransportURL string,
1146+
notificationTransportURL string,
11031147
keystoneAuthURL string,
11041148
secret corev1.Secret,
11051149
) (*novav1.NovaCell, nova.CellDeploymentStatus, error) {
11061150
Log := r.GetLogger(ctx)
11071151

1108-
cellSecretName, err := r.ensureCellSecret(ctx, h, instance, cellName, cellTemplate, cellTransportURL, secret)
1152+
cellSecretName, err := r.ensureCellSecret(
1153+
ctx, h, instance, cellName, cellTemplate,
1154+
cellTransportURL, notificationTransportURL,
1155+
secret)
11091156
if err != nil {
11101157
return nil, nova.CellDeploying, err
11111158
}
@@ -1639,6 +1686,7 @@ func (r *NovaReconciler) ensureMQ(
16391686

16401687
err = r.Client.Get(ctx, types.NamespacedName{Namespace: instance.Namespace, Name: transportName}, transportURL)
16411688
if err != nil && !k8s_errors.IsNotFound(err) {
1689+
Log.Info("", ":", "t-url-3")
16421690
return "", nova.MQFailed, util.WrapErrorForObject(
16431691
fmt.Sprintf("Error reading TransportURL object %s", transportName),
16441692
transportURL,
@@ -1651,6 +1699,7 @@ func (r *NovaReconciler) ensureMQ(
16511699
}
16521700

16531701
secretName := types.NamespacedName{Namespace: instance.Namespace, Name: transportURL.Status.SecretName}
1702+
16541703
secret := &corev1.Secret{}
16551704
err = h.GetClient().Get(ctx, secretName, secret)
16561705
if err != nil {
@@ -1665,7 +1714,6 @@ func (r *NovaReconciler) ensureMQ(
16651714
return "", nova.MQFailed, fmt.Errorf(
16661715
"%w: the TransportURL secret %s does not have 'transport_url' field", util.ErrFieldNotFound, transportURL.Status.SecretName)
16671716
}
1668-
16691717
return string(url), nova.MQCompleted, nil
16701718
}
16711719

@@ -1869,13 +1917,15 @@ func (r *NovaReconciler) ensureCellSecret(
18691917
cellName string,
18701918
cellTemplate novav1.NovaCellTemplate,
18711919
cellTransportURL string,
1920+
notificationTransportURL string,
18721921
externalSecret corev1.Secret,
18731922
) (string, error) {
18741923
// NOTE(gibi): We can move other sensitive data to the internal Secret from
18751924
// the NovaCellSpec fields, possibly hostnames or usernames.
18761925
data := map[string]string{
1877-
ServicePasswordSelector: string(externalSecret.Data[instance.Spec.PasswordSelectors.Service]),
1878-
TransportURLSelector: cellTransportURL,
1926+
ServicePasswordSelector: string(externalSecret.Data[instance.Spec.PasswordSelectors.Service]),
1927+
TransportURLSelector: cellTransportURL,
1928+
NotificationTransportURLSelector: notificationTransportURL,
18791929
}
18801930

18811931
// If metadata is enabled in the cell then the cell secret needs the
@@ -1919,14 +1969,16 @@ func (r *NovaReconciler) ensureTopLevelSecret(
19191969
h *helper.Helper,
19201970
instance *novav1.Nova,
19211971
apiTransportURL string,
1972+
notificationTransportURL string,
19221973
externalSecret corev1.Secret,
19231974
) (string, error) {
19241975
// NOTE(gibi): We can move other sensitive data to the internal Secret from
19251976
// the subCR fields, possibly hostnames or usernames.
19261977
data := map[string]string{
1927-
ServicePasswordSelector: string(externalSecret.Data[instance.Spec.PasswordSelectors.Service]),
1928-
MetadataSecretSelector: string(externalSecret.Data[instance.Spec.PasswordSelectors.MetadataSecret]),
1929-
TransportURLSelector: apiTransportURL,
1978+
ServicePasswordSelector: string(externalSecret.Data[instance.Spec.PasswordSelectors.Service]),
1979+
MetadataSecretSelector: string(externalSecret.Data[instance.Spec.PasswordSelectors.MetadataSecret]),
1980+
TransportURLSelector: apiTransportURL,
1981+
NotificationTransportURLSelector: notificationTransportURL,
19301982
}
19311983

19321984
// NOTE(gibi): When we switch to immutable secrets then we need to include

controllers/novaapi_controller.go

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -468,28 +468,29 @@ func (r *NovaAPIReconciler) generateConfigs(
468468
"keystone_internal_url": instance.Spec.KeystoneAuthURL,
469469
// NOTE(gibi): As per the definition of www_authenticate_uri this
470470
// always needs to point to the public keystone endpoint.
471-
"www_authenticate_uri": instance.Spec.KeystonePublicAuthURL,
472-
"nova_keystone_user": instance.Spec.ServiceUser,
473-
"nova_keystone_password": string(secret.Data[ServicePasswordSelector]),
474-
"api_db_name": NovaAPIDatabaseName,
475-
"api_db_user": apiDatabaseAccount.Spec.UserName,
476-
"api_db_password": string(apiDbSecret.Data[mariadbv1.DatabasePasswordSelector]),
477-
"api_db_address": instance.Spec.APIDatabaseHostname,
478-
"api_db_port": 3306,
479-
"cell_db_name": NovaCell0DatabaseName,
480-
"cell_db_user": cellDatabaseAccount.Spec.UserName,
481-
"cell_db_password": string(cellDbSecret.Data[mariadbv1.DatabasePasswordSelector]),
482-
"cell_db_address": instance.Spec.Cell0DatabaseHostname,
483-
"cell_db_port": 3306,
484-
"openstack_region_name": "regionOne", // fixme
485-
"default_project_domain": "Default", // fixme
486-
"default_user_domain": "Default", // fixme
487-
"transport_url": string(secret.Data[TransportURLSelector]),
488-
"log_file": "/var/log/nova/nova-api.log",
489-
"tls": false,
490-
"MemcachedServers": memcachedInstance.GetMemcachedServerListString(),
491-
"MemcachedServersWithInet": memcachedInstance.GetMemcachedServerListWithInetString(),
492-
"MemcachedTLS": memcachedInstance.GetMemcachedTLSSupport(),
471+
"www_authenticate_uri": instance.Spec.KeystonePublicAuthURL,
472+
"nova_keystone_user": instance.Spec.ServiceUser,
473+
"nova_keystone_password": string(secret.Data[ServicePasswordSelector]),
474+
"api_db_name": NovaAPIDatabaseName,
475+
"api_db_user": apiDatabaseAccount.Spec.UserName,
476+
"api_db_password": string(apiDbSecret.Data[mariadbv1.DatabasePasswordSelector]),
477+
"api_db_address": instance.Spec.APIDatabaseHostname,
478+
"api_db_port": 3306,
479+
"cell_db_name": NovaCell0DatabaseName,
480+
"cell_db_user": cellDatabaseAccount.Spec.UserName,
481+
"cell_db_password": string(cellDbSecret.Data[mariadbv1.DatabasePasswordSelector]),
482+
"cell_db_address": instance.Spec.Cell0DatabaseHostname,
483+
"cell_db_port": 3306,
484+
"openstack_region_name": "regionOne", // fixme
485+
"default_project_domain": "Default", // fixme
486+
"default_user_domain": "Default", // fixme
487+
"transport_url": string(secret.Data[TransportURLSelector]),
488+
"notification_transport_url": string(secret.Data[NotificationTransportURLSelector]),
489+
"log_file": "/var/log/nova/nova-api.log",
490+
"tls": false,
491+
"MemcachedServers": memcachedInstance.GetMemcachedServerListString(),
492+
"MemcachedServersWithInet": memcachedInstance.GetMemcachedServerListWithInetString(),
493+
"MemcachedTLS": memcachedInstance.GetMemcachedTLSSupport(),
493494
}
494495
// create httpd vhost template parameters
495496
httpdVhostConfig := map[string]interface{}{}

controllers/novaconductor_controller.go

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -426,23 +426,27 @@ func (r *NovaConductorReconciler) generateConfigs(
426426
cellDatabaseAccount := cellDB.GetAccount()
427427
cellDbSecret := cellDB.GetSecret()
428428

429+
Log := r.GetLogger(ctx)
430+
Log.Info("", "t-url - conductor", secret.Data)
431+
429432
templateParameters := map[string]interface{}{
430-
"service_name": "nova-conductor",
431-
"keystone_internal_url": instance.Spec.KeystoneAuthURL,
432-
"nova_keystone_user": instance.Spec.ServiceUser,
433-
"nova_keystone_password": string(secret.Data[ServicePasswordSelector]),
434-
"cell_db_name": getCellDatabaseName(instance.Spec.CellName),
435-
"cell_db_user": cellDatabaseAccount.Spec.UserName,
436-
"cell_db_password": string(cellDbSecret.Data[mariadbv1.DatabasePasswordSelector]),
437-
"cell_db_address": instance.Spec.CellDatabaseHostname,
438-
"cell_db_port": 3306,
439-
"openstack_region_name": "regionOne", // fixme
440-
"default_project_domain": "Default", // fixme
441-
"default_user_domain": "Default", // fixme
442-
"transport_url": string(secret.Data[TransportURLSelector]),
443-
"MemcachedServers": memcachedInstance.GetMemcachedServerListString(),
444-
"MemcachedServersWithInet": memcachedInstance.GetMemcachedServerListWithInetString(),
445-
"MemcachedTLS": memcachedInstance.GetMemcachedTLSSupport(),
433+
"service_name": "nova-conductor",
434+
"keystone_internal_url": instance.Spec.KeystoneAuthURL,
435+
"nova_keystone_user": instance.Spec.ServiceUser,
436+
"nova_keystone_password": string(secret.Data[ServicePasswordSelector]),
437+
"cell_db_name": getCellDatabaseName(instance.Spec.CellName),
438+
"cell_db_user": cellDatabaseAccount.Spec.UserName,
439+
"cell_db_password": string(cellDbSecret.Data[mariadbv1.DatabasePasswordSelector]),
440+
"cell_db_address": instance.Spec.CellDatabaseHostname,
441+
"cell_db_port": 3306,
442+
"openstack_region_name": "regionOne", // fixme
443+
"default_project_domain": "Default", // fixme
444+
"default_user_domain": "Default", // fixme
445+
"transport_url": string(secret.Data[TransportURLSelector]),
446+
"notification_transport_url": string(secret.Data[NotificationTransportURLSelector]),
447+
"MemcachedServers": memcachedInstance.GetMemcachedServerListString(),
448+
"MemcachedServersWithInet": memcachedInstance.GetMemcachedServerListWithInetString(),
449+
"MemcachedTLS": memcachedInstance.GetMemcachedTLSSupport(),
446450
}
447451
if len(instance.Spec.APIDatabaseHostname) > 0 {
448452
apiDatabaseAccount, apiDbSecret, err := mariadbv1.GetAccountAndSecret(ctx, h, instance.Spec.APIDatabaseAccount, instance.Namespace)

controllers/novascheduler_controller.go

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -172,16 +172,18 @@ func (r *NovaSchedulerReconciler) Reconcile(ctx context.Context, req ctrl.Reques
172172
// detect if something is changed.
173173
hashes := make(map[string]env.Setter)
174174

175+
requiredSecretFields := []string{
176+
ServicePasswordSelector,
177+
TransportURLSelector,
178+
}
179+
175180
secretHash, result, secret, err := ensureSecret(
176181
ctx,
177182
types.NamespacedName{Namespace: instance.Namespace, Name: instance.Spec.Secret},
178183
// TODO(gibi): add keystoneAuthURL here is that is also passed via
179184
// the Secret. Also add DB and MQ user name here too if those are
180185
// passed via the Secret
181-
[]string{
182-
ServicePasswordSelector,
183-
TransportURLSelector,
184-
},
186+
requiredSecretFields,
185187
h.GetClient(),
186188
&instance.Status.Conditions,
187189
r.RequeueTimeout,
@@ -512,28 +514,32 @@ func (r *NovaSchedulerReconciler) generateConfigs(
512514
return err
513515
}
514516

517+
Log := r.GetLogger(ctx)
518+
Log.Info("", "t-url - scheduler", secret.Data)
519+
515520
templateParameters := map[string]interface{}{
516-
"service_name": "nova-scheduler",
517-
"keystone_internal_url": instance.Spec.KeystoneAuthURL,
518-
"nova_keystone_user": instance.Spec.ServiceUser,
519-
"nova_keystone_password": string(secret.Data[ServicePasswordSelector]),
520-
"api_db_name": NovaAPIDatabaseName,
521-
"api_db_user": apiDatabaseAccount.Spec.UserName,
522-
"api_db_password": string(apiDbSecret.Data[mariadbv1.DatabasePasswordSelector]),
523-
"api_db_address": instance.Spec.APIDatabaseHostname,
524-
"api_db_port": 3306,
525-
"cell_db_name": NovaCell0DatabaseName,
526-
"cell_db_user": cellDatabaseAccount.Spec.UserName,
527-
"cell_db_password": string(cellDbSecret.Data[mariadbv1.DatabasePasswordSelector]),
528-
"cell_db_address": instance.Spec.Cell0DatabaseHostname,
529-
"cell_db_port": 3306,
530-
"openstack_region_name": "regionOne", // fixme
531-
"default_project_domain": "Default", // fixme
532-
"default_user_domain": "Default", // fixme
533-
"transport_url": string(secret.Data[TransportURLSelector]),
534-
"MemcachedServers": memcachedInstance.GetMemcachedServerListString(),
535-
"MemcachedServersWithInet": memcachedInstance.GetMemcachedServerListWithInetString(),
536-
"MemcachedTLS": memcachedInstance.GetMemcachedTLSSupport(),
521+
"service_name": "nova-scheduler",
522+
"keystone_internal_url": instance.Spec.KeystoneAuthURL,
523+
"nova_keystone_user": instance.Spec.ServiceUser,
524+
"nova_keystone_password": string(secret.Data[ServicePasswordSelector]),
525+
"api_db_name": NovaAPIDatabaseName,
526+
"api_db_user": apiDatabaseAccount.Spec.UserName,
527+
"api_db_password": string(apiDbSecret.Data[mariadbv1.DatabasePasswordSelector]),
528+
"api_db_address": instance.Spec.APIDatabaseHostname,
529+
"api_db_port": 3306,
530+
"cell_db_name": NovaCell0DatabaseName,
531+
"cell_db_user": cellDatabaseAccount.Spec.UserName,
532+
"cell_db_password": string(cellDbSecret.Data[mariadbv1.DatabasePasswordSelector]),
533+
"cell_db_address": instance.Spec.Cell0DatabaseHostname,
534+
"cell_db_port": 3306,
535+
"openstack_region_name": "regionOne", // fixme
536+
"default_project_domain": "Default", // fixme
537+
"default_user_domain": "Default", // fixme
538+
"transport_url": string(secret.Data[TransportURLSelector]),
539+
"notification_transport_url": string(secret.Data[NotificationTransportURLSelector]),
540+
"MemcachedServers": memcachedInstance.GetMemcachedServerListString(),
541+
"MemcachedServersWithInet": memcachedInstance.GetMemcachedServerListWithInetString(),
542+
"MemcachedTLS": memcachedInstance.GetMemcachedTLSSupport(),
537543
}
538544

539545
var tlsCfg *tls.Service

templates/nova.conf

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,10 +126,10 @@ api_paste_config = /etc/nova/api-paste.ini
126126
{{end}}
127127

128128
[oslo_messaging_notifications]
129-
{{ if (index . "nova_enabled_notification") }}
130-
transport_url = {{ .nova_cell_notify_transport_url }}
129+
{{ if (index . "notification_transport_url") }}
130+
transport_url = {{ .notification_transport_url }}
131131
driver = messagingv2
132-
notification_format=versioned
132+
notification_format=both
133133
{{ else }}
134134
driver = noop
135135
{{end}}

0 commit comments

Comments
 (0)