Notifications for flavor operations

This patch implements the versioned notifications for flavor
create and destroy.

Implement blueprint: flavor-notifications

Change-Id: Icc2169b87ffba4e7e2079076a82029156c584c6a
This commit is contained in:
liyingjun 2016-12-30 09:26:58 +08:00
parent 6817d22826
commit 8d9b3d6b9d
52 changed files with 594 additions and 94 deletions

View File

@ -28,6 +28,7 @@ from nova.objects import base
# Make sure that all the notification classes are defined so the # Make sure that all the notification classes are defined so the
# registration mechanism can pick them up later. # registration mechanism can pick them up later.
from nova.notifications.objects import exception from nova.notifications.objects import exception
from nova.notifications.objects import flavor
from nova.notifications.objects import instance from nova.notifications.objects import instance
from nova.notifications.objects import service from nova.notifications.objects import service

View File

@ -0,0 +1,23 @@
{
"priority": "INFO",
"payload": {
"nova_object.namespace": "nova",
"nova_object.version": "1.1",
"nova_object.name": "FlavorPayload",
"nova_object.data": {
"name": "test_flavor",
"memory_mb": 1024,
"ephemeral_gb": 0,
"disabled": false,
"vcpus": 2,
"swap": 0,
"rxtx_factor": 2.0,
"is_public": true,
"root_gb": 10,
"vcpu_weight": 0,
"flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3"
}
},
"event_type": "flavor.create",
"publisher_id": "nova-api:fake-mini"
}

View File

@ -0,0 +1,23 @@
{
"priority": "INFO",
"payload": {
"nova_object.namespace": "nova",
"nova_object.version": "1.1",
"nova_object.name": "FlavorPayload",
"nova_object.data": {
"name": "test_flavor",
"memory_mb": 1024,
"ephemeral_gb": 0,
"disabled": false,
"vcpus": 2,
"swap": 0,
"rxtx_factor": 2.0,
"is_public": true,
"root_gb": 10,
"vcpu_weight": 0,
"flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3"
}
},
"event_type": "flavor.delete",
"publisher_id": "nova-api:fake-mini"
}

View File

@ -42,12 +42,18 @@
"nova_object.name": "FlavorPayload", "nova_object.name": "FlavorPayload",
"nova_object.data": { "nova_object.data": {
"flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3", "flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3",
"name": "test_flavor",
"root_gb": 1, "root_gb": 1,
"vcpus": 1, "vcpus": 1,
"ephemeral_gb": 0, "ephemeral_gb": 0,
"memory_mb": 512 "memory_mb": 512,
"disabled": false,
"rxtx_factor": 1.0,
"swap": 0,
"is_public": true,
"vcpu_weight": 0
}, },
"nova_object.version": "1.0", "nova_object.version": "1.1",
"nova_object.namespace": "nova" "nova_object.namespace": "nova"
}, },
"user_id":"fake", "user_id":"fake",

View File

@ -39,12 +39,18 @@
"nova_object.name": "FlavorPayload", "nova_object.name": "FlavorPayload",
"nova_object.data": { "nova_object.data": {
"flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3", "flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3",
"name": "test_flavor",
"root_gb": 1, "root_gb": 1,
"vcpus": 1, "vcpus": 1,
"ephemeral_gb": 0, "ephemeral_gb": 0,
"memory_mb": 512 "memory_mb": 512,
"disabled": false,
"rxtx_factor": 1.0,
"swap": 0,
"is_public": true,
"vcpu_weight": 0
}, },
"nova_object.version": "1.0", "nova_object.version": "1.1",
"nova_object.namespace": "nova" "nova_object.namespace": "nova"
}, },
"user_id":"fake", "user_id":"fake",

View File

@ -29,12 +29,18 @@
"nova_object.name": "FlavorPayload", "nova_object.name": "FlavorPayload",
"nova_object.data": { "nova_object.data": {
"flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3", "flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3",
"name": "test_flavor",
"root_gb": 1, "root_gb": 1,
"vcpus": 1, "vcpus": 1,
"ephemeral_gb": 0, "ephemeral_gb": 0,
"memory_mb": 512 "memory_mb": 512,
"disabled": false,
"rxtx_factor": 1.0,
"swap": 0,
"is_public": true,
"vcpu_weight": 0
}, },
"nova_object.version": "1.0", "nova_object.version": "1.1",
"nova_object.namespace": "nova" "nova_object.namespace": "nova"
}, },
"user_id":"fake", "user_id":"fake",

View File

@ -29,12 +29,18 @@
"nova_object.name": "FlavorPayload", "nova_object.name": "FlavorPayload",
"nova_object.data": { "nova_object.data": {
"flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3", "flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3",
"name": "test_flavor",
"root_gb": 1, "root_gb": 1,
"vcpus": 1, "vcpus": 1,
"ephemeral_gb": 0, "ephemeral_gb": 0,
"memory_mb": 512 "memory_mb": 512,
"disabled": false,
"rxtx_factor": 1.0,
"swap": 0,
"is_public": true,
"vcpu_weight": 0
}, },
"nova_object.version": "1.0", "nova_object.version": "1.1",
"nova_object.namespace": "nova" "nova_object.namespace": "nova"
}, },
"user_id":"fake", "user_id":"fake",

View File

@ -42,12 +42,18 @@
"nova_object.name": "FlavorPayload", "nova_object.name": "FlavorPayload",
"nova_object.data": { "nova_object.data": {
"flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3", "flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3",
"name": "test_flavor",
"root_gb": 1, "root_gb": 1,
"vcpus": 1, "vcpus": 1,
"ephemeral_gb": 0, "ephemeral_gb": 0,
"memory_mb": 512 "memory_mb": 512,
"disabled": false,
"rxtx_factor": 1.0,
"swap": 0,
"is_public": true,
"vcpu_weight": 0
}, },
"nova_object.version": "1.0", "nova_object.version": "1.1",
"nova_object.namespace": "nova" "nova_object.namespace": "nova"
}, },
"user_id":"fake", "user_id":"fake",

View File

@ -42,12 +42,18 @@
"nova_object.name": "FlavorPayload", "nova_object.name": "FlavorPayload",
"nova_object.data": { "nova_object.data": {
"flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3", "flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3",
"name": "test_flavor",
"root_gb": 1, "root_gb": 1,
"vcpus": 1, "vcpus": 1,
"ephemeral_gb": 0, "ephemeral_gb": 0,
"memory_mb": 512 "memory_mb": 512,
"disabled": false,
"rxtx_factor": 1.0,
"swap": 0,
"is_public": true,
"vcpu_weight": 0
}, },
"nova_object.version": "1.0", "nova_object.version": "1.1",
"nova_object.namespace": "nova" "nova_object.namespace": "nova"
}, },
"user_id":"fake", "user_id":"fake",

View File

@ -42,12 +42,18 @@
"nova_object.name": "FlavorPayload", "nova_object.name": "FlavorPayload",
"nova_object.data": { "nova_object.data": {
"flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3", "flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3",
"name": "test_flavor",
"root_gb": 1, "root_gb": 1,
"vcpus": 1, "vcpus": 1,
"ephemeral_gb": 0, "ephemeral_gb": 0,
"memory_mb": 512 "memory_mb": 512,
"disabled": false,
"rxtx_factor": 1.0,
"swap": 0,
"is_public": true,
"vcpu_weight": 0
}, },
"nova_object.version": "1.0", "nova_object.version": "1.1",
"nova_object.namespace": "nova" "nova_object.namespace": "nova"
}, },
"user_id":"fake", "user_id":"fake",

View File

@ -42,12 +42,18 @@
"nova_object.name": "FlavorPayload", "nova_object.name": "FlavorPayload",
"nova_object.data": { "nova_object.data": {
"flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3", "flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3",
"name": "test_flavor",
"root_gb": 1, "root_gb": 1,
"vcpus": 1, "vcpus": 1,
"ephemeral_gb": 0, "ephemeral_gb": 0,
"memory_mb": 512 "memory_mb": 512,
"disabled": false,
"rxtx_factor": 1.0,
"swap": 0,
"is_public": true,
"vcpu_weight": 0
}, },
"nova_object.version": "1.0", "nova_object.version": "1.1",
"nova_object.namespace": "nova" "nova_object.namespace": "nova"
}, },
"user_id":"fake", "user_id":"fake",

View File

@ -42,12 +42,18 @@
"nova_object.name": "FlavorPayload", "nova_object.name": "FlavorPayload",
"nova_object.data": { "nova_object.data": {
"flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3", "flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3",
"name": "test_flavor",
"root_gb": 1, "root_gb": 1,
"vcpus": 1, "vcpus": 1,
"ephemeral_gb": 0, "ephemeral_gb": 0,
"memory_mb": 512 "memory_mb": 512,
"disabled": false,
"rxtx_factor": 1.0,
"swap": 0,
"is_public": true,
"vcpu_weight": 0
}, },
"nova_object.version": "1.0", "nova_object.version": "1.1",
"nova_object.namespace": "nova" "nova_object.namespace": "nova"
}, },
"user_id":"fake", "user_id":"fake",

View File

@ -42,12 +42,18 @@
"nova_object.name": "FlavorPayload", "nova_object.name": "FlavorPayload",
"nova_object.data": { "nova_object.data": {
"flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3", "flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3",
"name": "test_flavor",
"root_gb": 1, "root_gb": 1,
"vcpus": 1, "vcpus": 1,
"ephemeral_gb": 0, "ephemeral_gb": 0,
"memory_mb": 512 "memory_mb": 512,
"disabled": false,
"rxtx_factor": 1.0,
"swap": 0,
"is_public": true,
"vcpu_weight": 0
}, },
"nova_object.version": "1.0", "nova_object.version": "1.1",
"nova_object.namespace": "nova" "nova_object.namespace": "nova"
}, },
"user_id":"fake", "user_id":"fake",

View File

@ -42,12 +42,18 @@
"nova_object.name": "FlavorPayload", "nova_object.name": "FlavorPayload",
"nova_object.data": { "nova_object.data": {
"flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3", "flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3",
"name": "test_flavor",
"root_gb": 1, "root_gb": 1,
"vcpus": 1, "vcpus": 1,
"ephemeral_gb": 0, "ephemeral_gb": 0,
"memory_mb": 512 "memory_mb": 512,
"disabled": false,
"rxtx_factor": 1.0,
"swap": 0,
"is_public": true,
"vcpu_weight": 0
}, },
"nova_object.version": "1.0", "nova_object.version": "1.1",
"nova_object.namespace": "nova" "nova_object.namespace": "nova"
}, },
"user_id":"fake", "user_id":"fake",

View File

@ -42,12 +42,18 @@
"nova_object.name": "FlavorPayload", "nova_object.name": "FlavorPayload",
"nova_object.data": { "nova_object.data": {
"flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3", "flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3",
"name": "test_flavor",
"root_gb": 1, "root_gb": 1,
"vcpus": 1, "vcpus": 1,
"ephemeral_gb": 0, "ephemeral_gb": 0,
"memory_mb": 512 "memory_mb": 512,
"disabled": false,
"rxtx_factor": 1.0,
"swap": 0,
"is_public": true,
"vcpu_weight": 0
}, },
"nova_object.version": "1.0", "nova_object.version": "1.1",
"nova_object.namespace": "nova" "nova_object.namespace": "nova"
}, },
"user_id":"fake", "user_id":"fake",

View File

@ -42,12 +42,18 @@
"nova_object.name": "FlavorPayload", "nova_object.name": "FlavorPayload",
"nova_object.data": { "nova_object.data": {
"flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3", "flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3",
"name": "test_flavor",
"root_gb": 1, "root_gb": 1,
"vcpus": 1, "vcpus": 1,
"ephemeral_gb": 0, "ephemeral_gb": 0,
"memory_mb": 512 "memory_mb": 512,
"disabled": false,
"rxtx_factor": 1.0,
"swap": 0,
"is_public": true,
"vcpu_weight": 0
}, },
"nova_object.version": "1.0", "nova_object.version": "1.1",
"nova_object.namespace": "nova" "nova_object.namespace": "nova"
}, },
"user_id":"fake", "user_id":"fake",

View File

@ -42,12 +42,18 @@
"nova_object.name": "FlavorPayload", "nova_object.name": "FlavorPayload",
"nova_object.data": { "nova_object.data": {
"flavorid": "d5a8bb54-365a-45ae-abdb-38d249df7845", "flavorid": "d5a8bb54-365a-45ae-abdb-38d249df7845",
"name": "other_flavor",
"root_gb": 1, "root_gb": 1,
"vcpus": 1, "vcpus": 1,
"ephemeral_gb": 0, "ephemeral_gb": 0,
"memory_mb": 256 "memory_mb": 256,
"disabled": false,
"rxtx_factor": 1.0,
"swap": 0,
"is_public": true,
"vcpu_weight": 0
}, },
"nova_object.version": "1.0", "nova_object.version": "1.1",
"nova_object.namespace": "nova" "nova_object.namespace": "nova"
}, },
"user_id":"fake", "user_id":"fake",

View File

@ -42,12 +42,18 @@
"nova_object.name": "FlavorPayload", "nova_object.name": "FlavorPayload",
"nova_object.data": { "nova_object.data": {
"flavorid": "d5a8bb54-365a-45ae-abdb-38d249df7845", "flavorid": "d5a8bb54-365a-45ae-abdb-38d249df7845",
"name": "other_flavor",
"root_gb": 1, "root_gb": 1,
"vcpus": 1, "vcpus": 1,
"ephemeral_gb": 0, "ephemeral_gb": 0,
"memory_mb": 256 "memory_mb": 256,
"disabled": false,
"rxtx_factor": 1.0,
"swap": 0,
"is_public": true,
"vcpu_weight": 0
}, },
"nova_object.version": "1.0", "nova_object.version": "1.1",
"nova_object.namespace": "nova" "nova_object.namespace": "nova"
}, },
"user_id":"fake", "user_id":"fake",

View File

@ -42,12 +42,18 @@
"nova_object.name": "FlavorPayload", "nova_object.name": "FlavorPayload",
"nova_object.data": { "nova_object.data": {
"flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3", "flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3",
"name": "test_flavor",
"root_gb": 1, "root_gb": 1,
"vcpus": 1, "vcpus": 1,
"ephemeral_gb": 0, "ephemeral_gb": 0,
"memory_mb": 512 "memory_mb": 512,
"disabled": false,
"rxtx_factor": 1.0,
"swap": 0,
"is_public": true,
"vcpu_weight": 0
}, },
"nova_object.version": "1.0", "nova_object.version": "1.1",
"nova_object.namespace": "nova" "nova_object.namespace": "nova"
}, },
"user_id":"fake", "user_id":"fake",

View File

@ -42,12 +42,18 @@
"nova_object.name": "FlavorPayload", "nova_object.name": "FlavorPayload",
"nova_object.data": { "nova_object.data": {
"flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3", "flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3",
"name": "test_flavor",
"root_gb": 1, "root_gb": 1,
"vcpus": 1, "vcpus": 1,
"ephemeral_gb": 0, "ephemeral_gb": 0,
"memory_mb": 512 "memory_mb": 512,
"disabled": false,
"rxtx_factor": 1.0,
"swap": 0,
"is_public": true,
"vcpu_weight": 0
}, },
"nova_object.version": "1.0", "nova_object.version": "1.1",
"nova_object.namespace": "nova" "nova_object.namespace": "nova"
}, },
"user_id":"fake", "user_id":"fake",

View File

@ -42,12 +42,18 @@
"nova_object.name": "FlavorPayload", "nova_object.name": "FlavorPayload",
"nova_object.data": { "nova_object.data": {
"flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3", "flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3",
"name": "test_flavor",
"root_gb": 1, "root_gb": 1,
"vcpus": 1, "vcpus": 1,
"ephemeral_gb": 0, "ephemeral_gb": 0,
"memory_mb": 512 "memory_mb": 512,
"disabled": false,
"rxtx_factor": 1.0,
"swap": 0,
"is_public": true,
"vcpu_weight": 0
}, },
"nova_object.version": "1.0", "nova_object.version": "1.1",
"nova_object.namespace": "nova" "nova_object.namespace": "nova"
}, },
"user_id":"fake", "user_id":"fake",

View File

@ -42,12 +42,18 @@
"nova_object.name": "FlavorPayload", "nova_object.name": "FlavorPayload",
"nova_object.data": { "nova_object.data": {
"flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3", "flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3",
"name": "test_flavor",
"root_gb": 1, "root_gb": 1,
"vcpus": 1, "vcpus": 1,
"ephemeral_gb": 0, "ephemeral_gb": 0,
"memory_mb": 512 "memory_mb": 512,
"disabled": false,
"rxtx_factor": 1.0,
"swap": 0,
"is_public": true,
"vcpu_weight": 0
}, },
"nova_object.version": "1.0", "nova_object.version": "1.1",
"nova_object.namespace": "nova" "nova_object.namespace": "nova"
}, },
"user_id":"fake", "user_id":"fake",

View File

@ -42,12 +42,18 @@
"nova_object.name": "FlavorPayload", "nova_object.name": "FlavorPayload",
"nova_object.data": { "nova_object.data": {
"flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3", "flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3",
"name": "test_flavor",
"root_gb": 1, "root_gb": 1,
"vcpus": 1, "vcpus": 1,
"ephemeral_gb": 0, "ephemeral_gb": 0,
"memory_mb": 512 "memory_mb": 512,
"disabled": false,
"rxtx_factor": 1.0,
"swap": 0,
"is_public": true,
"vcpu_weight": 0
}, },
"nova_object.version": "1.0", "nova_object.version": "1.1",
"nova_object.namespace": "nova" "nova_object.namespace": "nova"
}, },
"user_id":"fake", "user_id":"fake",

View File

@ -42,12 +42,18 @@
"nova_object.name": "FlavorPayload", "nova_object.name": "FlavorPayload",
"nova_object.data": { "nova_object.data": {
"flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3", "flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3",
"name": "test_flavor",
"root_gb": 1, "root_gb": 1,
"vcpus": 1, "vcpus": 1,
"ephemeral_gb": 0, "ephemeral_gb": 0,
"memory_mb": 512 "memory_mb": 512,
"disabled": false,
"rxtx_factor": 1.0,
"swap": 0,
"is_public": true,
"vcpu_weight": 0
}, },
"nova_object.version": "1.0", "nova_object.version": "1.1",
"nova_object.namespace": "nova" "nova_object.namespace": "nova"
}, },
"user_id":"fake", "user_id":"fake",

View File

@ -42,12 +42,18 @@
"nova_object.name": "FlavorPayload", "nova_object.name": "FlavorPayload",
"nova_object.data": { "nova_object.data": {
"flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3", "flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3",
"name": "test_flavor",
"root_gb": 1, "root_gb": 1,
"vcpus": 1, "vcpus": 1,
"ephemeral_gb": 0, "ephemeral_gb": 0,
"memory_mb": 512 "memory_mb": 512,
"disabled": false,
"rxtx_factor": 1.0,
"swap": 0,
"is_public": true,
"vcpu_weight": 0
}, },
"nova_object.version": "1.0", "nova_object.version": "1.1",
"nova_object.namespace": "nova" "nova_object.namespace": "nova"
}, },
"user_id":"fake", "user_id":"fake",

View File

@ -42,12 +42,18 @@
"nova_object.name": "FlavorPayload", "nova_object.name": "FlavorPayload",
"nova_object.data": { "nova_object.data": {
"flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3", "flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3",
"name": "test_flavor",
"root_gb": 1, "root_gb": 1,
"vcpus": 1, "vcpus": 1,
"ephemeral_gb": 0, "ephemeral_gb": 0,
"memory_mb": 512 "memory_mb": 512,
"disabled": false,
"rxtx_factor": 1.0,
"swap": 0,
"is_public": true,
"vcpu_weight": 0
}, },
"nova_object.version": "1.0", "nova_object.version": "1.1",
"nova_object.namespace": "nova" "nova_object.namespace": "nova"
}, },
"user_id":"fake", "user_id":"fake",

View File

@ -42,12 +42,18 @@
"nova_object.name": "FlavorPayload", "nova_object.name": "FlavorPayload",
"nova_object.data": { "nova_object.data": {
"flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3", "flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3",
"name": "test_flavor",
"root_gb": 1, "root_gb": 1,
"vcpus": 1, "vcpus": 1,
"ephemeral_gb": 0, "ephemeral_gb": 0,
"memory_mb": 512 "memory_mb": 512,
"disabled": false,
"rxtx_factor": 1.0,
"swap": 0,
"is_public": true,
"vcpu_weight": 0
}, },
"nova_object.version": "1.0", "nova_object.version": "1.1",
"nova_object.namespace": "nova" "nova_object.namespace": "nova"
}, },
"user_id":"fake", "user_id":"fake",

View File

@ -42,12 +42,18 @@
"nova_object.name": "FlavorPayload", "nova_object.name": "FlavorPayload",
"nova_object.data": { "nova_object.data": {
"flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3", "flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3",
"name": "test_flavor",
"root_gb": 1, "root_gb": 1,
"vcpus": 1, "vcpus": 1,
"ephemeral_gb": 0, "ephemeral_gb": 0,
"memory_mb": 512 "memory_mb": 512,
"disabled": false,
"rxtx_factor": 1.0,
"swap": 0,
"is_public": true,
"vcpu_weight": 0
}, },
"nova_object.version": "1.0", "nova_object.version": "1.1",
"nova_object.namespace": "nova" "nova_object.namespace": "nova"
}, },
"user_id":"fake", "user_id":"fake",

View File

@ -42,12 +42,18 @@
"nova_object.name": "FlavorPayload", "nova_object.name": "FlavorPayload",
"nova_object.data": { "nova_object.data": {
"flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3", "flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3",
"name": "test_flavor",
"root_gb": 1, "root_gb": 1,
"vcpus": 1, "vcpus": 1,
"ephemeral_gb": 0, "ephemeral_gb": 0,
"memory_mb": 512 "memory_mb": 512,
"disabled": false,
"rxtx_factor": 1.0,
"swap": 0,
"is_public": true,
"vcpu_weight": 0
}, },
"nova_object.version": "1.0", "nova_object.version": "1.1",
"nova_object.namespace": "nova" "nova_object.namespace": "nova"
}, },
"user_id":"fake", "user_id":"fake",

View File

@ -42,12 +42,18 @@
"nova_object.name": "FlavorPayload", "nova_object.name": "FlavorPayload",
"nova_object.data": { "nova_object.data": {
"flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3", "flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3",
"name": "test_flavor",
"root_gb": 1, "root_gb": 1,
"vcpus": 1, "vcpus": 1,
"ephemeral_gb": 0, "ephemeral_gb": 0,
"memory_mb": 512 "memory_mb": 512,
"disabled": false,
"rxtx_factor": 1.0,
"swap": 0,
"is_public": true,
"vcpu_weight": 0
}, },
"nova_object.version": "1.0", "nova_object.version": "1.1",
"nova_object.namespace": "nova" "nova_object.namespace": "nova"
}, },
"user_id":"fake", "user_id":"fake",

View File

@ -42,12 +42,18 @@
"nova_object.name": "FlavorPayload", "nova_object.name": "FlavorPayload",
"nova_object.data": { "nova_object.data": {
"flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3", "flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3",
"name": "test_flavor",
"root_gb": 1, "root_gb": 1,
"vcpus": 1, "vcpus": 1,
"ephemeral_gb": 0, "ephemeral_gb": 0,
"memory_mb": 512 "memory_mb": 512,
"disabled": false,
"rxtx_factor": 1.0,
"swap": 0,
"is_public": true,
"vcpu_weight": 0
}, },
"nova_object.version": "1.0", "nova_object.version": "1.1",
"nova_object.namespace": "nova" "nova_object.namespace": "nova"
}, },
"user_id":"fake", "user_id":"fake",

View File

@ -42,12 +42,18 @@
"nova_object.name": "FlavorPayload", "nova_object.name": "FlavorPayload",
"nova_object.data": { "nova_object.data": {
"flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3", "flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3",
"name": "test_flavor",
"root_gb": 1, "root_gb": 1,
"vcpus": 1, "vcpus": 1,
"ephemeral_gb": 0, "ephemeral_gb": 0,
"memory_mb": 512 "memory_mb": 512,
"disabled": false,
"rxtx_factor": 1.0,
"swap": 0,
"is_public": true,
"vcpu_weight": 0
}, },
"nova_object.version": "1.0", "nova_object.version": "1.1",
"nova_object.namespace": "nova" "nova_object.namespace": "nova"
}, },
"user_id":"fake", "user_id":"fake",

View File

@ -42,12 +42,18 @@
"nova_object.name": "FlavorPayload", "nova_object.name": "FlavorPayload",
"nova_object.data": { "nova_object.data": {
"flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3", "flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3",
"name": "test_flavor",
"root_gb": 1, "root_gb": 1,
"vcpus": 1, "vcpus": 1,
"ephemeral_gb": 0, "ephemeral_gb": 0,
"memory_mb": 512 "memory_mb": 512,
"disabled": false,
"rxtx_factor": 1.0,
"swap": 0,
"is_public": true,
"vcpu_weight": 0
}, },
"nova_object.version": "1.0", "nova_object.version": "1.1",
"nova_object.namespace": "nova" "nova_object.namespace": "nova"
}, },
"user_id":"fake", "user_id":"fake",

View File

@ -42,12 +42,18 @@
"nova_object.name": "FlavorPayload", "nova_object.name": "FlavorPayload",
"nova_object.data": { "nova_object.data": {
"flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3", "flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3",
"name": "test_flavor",
"root_gb": 1, "root_gb": 1,
"vcpus": 1, "vcpus": 1,
"ephemeral_gb": 0, "ephemeral_gb": 0,
"memory_mb": 512 "memory_mb": 512,
"disabled": false,
"rxtx_factor": 1.0,
"swap": 0,
"is_public": true,
"vcpu_weight": 0
}, },
"nova_object.version": "1.0", "nova_object.version": "1.1",
"nova_object.namespace": "nova" "nova_object.namespace": "nova"
}, },
"user_id":"fake", "user_id":"fake",

View File

@ -42,12 +42,18 @@
"nova_object.name": "FlavorPayload", "nova_object.name": "FlavorPayload",
"nova_object.data": { "nova_object.data": {
"flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3", "flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3",
"name": "test_flavor",
"root_gb": 1, "root_gb": 1,
"vcpus": 1, "vcpus": 1,
"ephemeral_gb": 0, "ephemeral_gb": 0,
"memory_mb": 512 "memory_mb": 512,
"disabled": false,
"rxtx_factor": 1.0,
"swap": 0,
"is_public": true,
"vcpu_weight": 0
}, },
"nova_object.version": "1.0", "nova_object.version": "1.1",
"nova_object.namespace": "nova" "nova_object.namespace": "nova"
}, },
"user_id":"fake", "user_id":"fake",

View File

@ -42,12 +42,18 @@
"nova_object.name": "FlavorPayload", "nova_object.name": "FlavorPayload",
"nova_object.data": { "nova_object.data": {
"flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3", "flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3",
"name": "test_flavor",
"root_gb": 1, "root_gb": 1,
"vcpus": 1, "vcpus": 1,
"ephemeral_gb": 0, "ephemeral_gb": 0,
"memory_mb": 512 "memory_mb": 512,
"disabled": false,
"rxtx_factor": 1.0,
"swap": 0,
"is_public": true,
"vcpu_weight": 0
}, },
"nova_object.version": "1.0", "nova_object.version": "1.1",
"nova_object.namespace": "nova" "nova_object.namespace": "nova"
}, },
"user_id":"fake", "user_id":"fake",

View File

@ -47,12 +47,18 @@
"nova_object.name": "FlavorPayload", "nova_object.name": "FlavorPayload",
"nova_object.data": { "nova_object.data": {
"flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3", "flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3",
"name": "test_flavor",
"root_gb": 1, "root_gb": 1,
"vcpus": 1, "vcpus": 1,
"ephemeral_gb": 0, "ephemeral_gb": 0,
"memory_mb": 512 "memory_mb": 512,
"disabled": false,
"rxtx_factor": 1.0,
"swap": 0,
"is_public": true,
"vcpu_weight": 0
}, },
"nova_object.version": "1.0", "nova_object.version": "1.1",
"nova_object.namespace": "nova" "nova_object.namespace": "nova"
}, },
"user_id": "fake", "user_id": "fake",

View File

@ -11,14 +11,20 @@
"flavor": { "flavor": {
"nova_object.data": { "nova_object.data": {
"flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3", "flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3",
"name": "test_flavor",
"root_gb": 1, "root_gb": 1,
"vcpus": 1, "vcpus": 1,
"ephemeral_gb": 0, "ephemeral_gb": 0,
"memory_mb": 512 "memory_mb": 512,
"disabled": false,
"rxtx_factor": 1.0,
"swap": 0,
"is_public": true,
"vcpu_weight": 0
}, },
"nova_object.name": "FlavorPayload", "nova_object.name": "FlavorPayload",
"nova_object.namespace": "nova", "nova_object.namespace": "nova",
"nova_object.version": "1.0" "nova_object.version": "1.1"
}, },
"host": "compute", "host": "compute",
"host_name": "some-server", "host_name": "some-server",

View File

@ -21,14 +21,20 @@
"flavor": { "flavor": {
"nova_object.data": { "nova_object.data": {
"flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3", "flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3",
"name": "test_flavor",
"root_gb": 1, "root_gb": 1,
"vcpus": 1, "vcpus": 1,
"ephemeral_gb": 0, "ephemeral_gb": 0,
"memory_mb": 512 "memory_mb": 512,
"disabled": false,
"rxtx_factor": 1.0,
"swap": 0,
"is_public": true,
"vcpu_weight": 0
}, },
"nova_object.name": "FlavorPayload", "nova_object.name": "FlavorPayload",
"nova_object.namespace": "nova", "nova_object.namespace": "nova",
"nova_object.version": "1.0" "nova_object.version": "1.1"
}, },
"host": "compute", "host": "compute",
"host_name": "some-server", "host_name": "some-server",

View File

@ -11,14 +11,20 @@
"flavor": { "flavor": {
"nova_object.data": { "nova_object.data": {
"flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3", "flavorid": "a22d5517-147c-4147-a0d1-e698df5cd4e3",
"name": "test_flavor",
"root_gb": 1, "root_gb": 1,
"vcpus": 1, "vcpus": 1,
"ephemeral_gb": 0, "ephemeral_gb": 0,
"memory_mb": 512 "memory_mb": 512,
"disabled": false,
"rxtx_factor": 1.0,
"swap": 0,
"is_public": true,
"vcpu_weight": 0
}, },
"nova_object.name": "FlavorPayload", "nova_object.name": "FlavorPayload",
"nova_object.namespace": "nova", "nova_object.namespace": "nova",
"nova_object.version": "1.0" "nova_object.version": "1.1"
}, },
"host": "compute", "host": "compute",
"host_name": "some-server", "host_name": "some-server",

View File

@ -364,7 +364,7 @@ def notify_about_instance_action(context, instance, host, action, phase=None,
""" """
ips = _get_instance_ips(instance) ips = _get_instance_ips(instance)
flavor = flavor_notification.FlavorPayload(instance=instance) flavor = flavor_notification.FlavorPayload(instance.flavor)
fault, priority = _get_fault_and_priority_from_exc(exception) fault, priority = _get_fault_and_priority_from_exc(exception)
payload = instance_notification.InstanceActionPayload( payload = instance_notification.InstanceActionPayload(
instance=instance, instance=instance,
@ -400,7 +400,7 @@ def notify_about_volume_swap(context, instance, host, action, phase,
""" """
ips = _get_instance_ips(instance) ips = _get_instance_ips(instance)
flavor = flavor_notification.FlavorPayload(instance=instance) flavor = flavor_notification.FlavorPayload(instance.flavor)
fault, priority = _get_fault_and_priority_from_exc(exception) fault, priority = _get_fault_and_priority_from_exc(exception)
payload = instance_notification.InstanceActionVolumeSwapPayload( payload = instance_notification.InstanceActionVolumeSwapPayload(

View File

@ -281,7 +281,7 @@ def _send_versioned_instance_update(context, instance, payload, host, service):
for label, bw in payload['bandwidth'].items()] for label, bw in payload['bandwidth'].items()]
network_info = instance.info_cache.network_info network_info = instance.info_cache.network_info
flavor = flavor_notification.FlavorPayload(instance=instance) flavor = flavor_notification.FlavorPayload(instance.flavor)
versioned_payload = instance_notification.InstanceUpdatePayload( versioned_payload = instance_notification.InstanceUpdatePayload(
instance=instance, instance=instance,

View File

@ -10,22 +10,45 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
from oslo_utils import versionutils
from nova.notifications.objects import base from nova.notifications.objects import base
from nova.objects import base as nova_base from nova.objects import base as nova_base
from nova.objects import fields from nova.objects import fields
@base.notification_sample('flavor-create.json')
@base.notification_sample('flavor-delete.json')
@nova_base.NovaObjectRegistry.register_notification @nova_base.NovaObjectRegistry.register_notification
class FlavorPayload(base.NotificationPayloadBase): class FlavorNotification(base.NotificationBase):
# Version 1.0: Initial version # Version 1.0: Initial version
VERSION = '1.0' VERSION = '1.0'
fields = {
'payload': fields.ObjectField('FlavorPayload')
}
@nova_base.NovaObjectRegistry.register_notification
class FlavorPayload(base.NotificationPayloadBase):
# Version 1.0: Initial version
# Version 1.1: Add other fields for Flavor
VERSION = '1.1'
# NOTE: if we'd want to rename some fields(memory_mb->ram, root_gb->disk,
# ephemeral_gb: ephemeral), bumping to payload version 2.0 will be needed.
SCHEMA = { SCHEMA = {
'flavorid': ('flavor', 'flavorid'), 'flavorid': ('flavor', 'flavorid'),
'memory_mb': ('flavor', 'memory_mb'), 'memory_mb': ('flavor', 'memory_mb'),
'vcpus': ('flavor', 'vcpus'), 'vcpus': ('flavor', 'vcpus'),
'root_gb': ('flavor', 'root_gb'), 'root_gb': ('flavor', 'root_gb'),
'ephemeral_gb': ('flavor', 'ephemeral_gb'), 'ephemeral_gb': ('flavor', 'ephemeral_gb'),
'name': ('flavor', 'name'),
'swap': ('flavor', 'swap'),
'rxtx_factor': ('flavor', 'rxtx_factor'),
'vcpu_weight': ('flavor', 'vcpu_weight'),
'disabled': ('flavor', 'disabled'),
'is_public': ('flavor', 'is_public'),
} }
fields = { fields = {
@ -34,8 +57,26 @@ class FlavorPayload(base.NotificationPayloadBase):
'vcpus': fields.IntegerField(nullable=True), 'vcpus': fields.IntegerField(nullable=True),
'root_gb': fields.IntegerField(nullable=True), 'root_gb': fields.IntegerField(nullable=True),
'ephemeral_gb': fields.IntegerField(nullable=True), 'ephemeral_gb': fields.IntegerField(nullable=True),
'name': fields.StringField(),
'swap': fields.IntegerField(),
'rxtx_factor': fields.FloatField(nullable=True),
'vcpu_weight': fields.IntegerField(nullable=True),
'disabled': fields.BooleanField(),
'is_public': fields.BooleanField(),
} }
def __init__(self, instance, **kwargs): def __init__(self, flavor, **kwargs):
super(FlavorPayload, self).__init__(**kwargs) super(FlavorPayload, self).__init__(**kwargs)
self.populate_schema(instance=instance, flavor=instance.flavor) self.populate_schema(flavor=flavor)
def obj_make_compatible(self, primitive, target_version):
super(FlavorPayload, self).obj_make_compatible(primitive,
target_version)
target_version = versionutils.convert_version_to_tuple(target_version)
if target_version < (1, 1):
primitive.pop('name', None)
primitive.pop('swap', None)
primitive.pop('rxtx_factor', None)
primitive.pop('vcpu_weight', None)
primitive.pop('disabled', None)
primitive.pop('is_public', None)

View File

@ -22,6 +22,7 @@ from sqlalchemy.sql import func
from sqlalchemy.sql import text from sqlalchemy.sql import text
from sqlalchemy.sql import true from sqlalchemy.sql import true
import nova.conf
from nova import db from nova import db
from nova.db.sqlalchemy import api as db_api from nova.db.sqlalchemy import api as db_api
from nova.db.sqlalchemy.api import require_context from nova.db.sqlalchemy.api import require_context
@ -29,6 +30,8 @@ from nova.db.sqlalchemy import api_models
from nova.db.sqlalchemy import models as main_models from nova.db.sqlalchemy import models as main_models
from nova import exception from nova import exception
from nova.i18n import _LW from nova.i18n import _LW
from nova.notifications.objects import base as notification
from nova.notifications.objects import flavor as flavor_notification
from nova import objects from nova import objects
from nova.objects import base from nova.objects import base
from nova.objects import fields from nova.objects import fields
@ -38,6 +41,8 @@ LOG = logging.getLogger(__name__)
OPTIONAL_FIELDS = ['extra_specs', 'projects'] OPTIONAL_FIELDS = ['extra_specs', 'projects']
DEPRECATED_FIELDS = ['deleted', 'deleted_at'] DEPRECATED_FIELDS = ['deleted', 'deleted_at']
CONF = nova.conf.CONF
def _dict_with_extra_specs(flavor_model): def _dict_with_extra_specs(flavor_model):
extra_specs = {x['key']: x['value'] extra_specs = {x['key']: x['value']
@ -185,6 +190,7 @@ def _flavor_destroy(context, flavor_id=None, flavorid=None):
context.session.query(api_models.FlavorExtraSpecs).\ context.session.query(api_models.FlavorExtraSpecs).\
filter_by(flavor_id=result.id).delete() filter_by(flavor_id=result.id).delete()
context.session.delete(result) context.session.delete(result)
return result
@db_api.pick_context_manager_reader @db_api.pick_context_manager_reader
@ -487,6 +493,7 @@ class Flavor(base.NovaPersistentObject, base.NovaObject,
db_flavor = self._flavor_create(self._context, updates) db_flavor = self._flavor_create(self._context, updates)
self._from_db_object(self._context, self, db_flavor, self._from_db_object(self._context, self, db_flavor,
expected_attrs=expected_attrs) expected_attrs=expected_attrs)
self._send_notification(fields.NotificationAction.CREATE)
@base.remotable @base.remotable
def save_projects(self, to_add=None, to_delete=None): def save_projects(self, to_add=None, to_delete=None):
@ -574,7 +581,7 @@ class Flavor(base.NovaPersistentObject, base.NovaObject,
@staticmethod @staticmethod
def _flavor_destroy(context, flavor_id=None, flavorid=None): def _flavor_destroy(context, flavor_id=None, flavorid=None):
_flavor_destroy(context, flavor_id=flavor_id, flavorid=flavorid) return _flavor_destroy(context, flavor_id=flavor_id, flavorid=flavorid)
@base.remotable @base.remotable
def destroy(self): def destroy(self):
@ -586,12 +593,29 @@ class Flavor(base.NovaPersistentObject, base.NovaObject,
# far more specific. # far more specific.
try: try:
if 'id' in self: if 'id' in self:
self._flavor_destroy(self._context, flavor_id=self.id) db_flavor = self._flavor_destroy(self._context,
flavor_id=self.id)
else: else:
self._flavor_destroy(self._context, flavorid=self.flavorid) db_flavor = self._flavor_destroy(self._context,
flavorid=self.flavorid)
self._from_db_object(self._context, self, db_flavor)
self._send_notification(fields.NotificationAction.DELETE)
except exception.FlavorNotFound: except exception.FlavorNotFound:
db.flavor_destroy(self._context, self.flavorid) db.flavor_destroy(self._context, self.flavorid)
def _send_notification(self, action):
notification_type = flavor_notification.FlavorNotification
payload_type = flavor_notification.FlavorPayload
payload = payload_type(self)
notification_type(
publisher=notification.NotificationPublisher(
host=CONF.host, binary="nova-api"),
event_type=notification.EventType(object="flavor",
action=action),
priority=fields.NotificationPriority.INFO,
payload=payload).emit(self._context)
@db_api.api_context_manager.reader @db_api.api_context_manager.reader
def _flavor_get_all_from_db(context, inactive, filters, sort_key, sort_dir, def _flavor_get_all_from_db(context, inactive, filters, sort_key, sort_dir,

View File

@ -143,6 +143,8 @@ class NotificationSampleTestBase(test.TestCase,
}} }}
flavor_id = self.api.post_flavor(flavor_body)['id'] flavor_id = self.api.post_flavor(flavor_body)['id']
# Ignore the create flavor notification
fake_notifier.reset()
server = self._build_minimal_create_server_request( server = self._build_minimal_create_server_request(
self.api, 'some-server', self.api, 'some-server',

View File

@ -0,0 +1,51 @@
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from nova.tests.functional.notification_sample_tests \
import notification_sample_base
from nova.tests.unit import fake_notifier
class TestFlavorNotificationSample(
notification_sample_base.NotificationSampleTestBase):
def test_flavor_create(self):
body = {
"flavor": {
"name": "test_flavor",
"ram": 1024,
"vcpus": 2,
"disk": 10,
"id": "a22d5517-147c-4147-a0d1-e698df5cd4e3",
"rxtx_factor": 2.0
}
}
self.admin_api.api_post('flavors', body)
self._verify_notification('flavor-create')
def test_flavor_destroy(self):
body = {
"flavor": {
"name": "test_flavor",
"ram": 1024,
"vcpus": 2,
"disk": 10,
"id": "a22d5517-147c-4147-a0d1-e698df5cd4e3",
"rxtx_factor": 2.0
}
}
# Create a flavor.
self.admin_api.api_post('flavors', body)
self.admin_api.api_delete(
'flavors/a22d5517-147c-4147-a0d1-e698df5cd4e3')
self._verify_notification(
'flavor-delete', actual=fake_notifier.VERSIONED_NOTIFICATIONS[1])

View File

@ -487,6 +487,8 @@ class TestInstanceNotificationSample(
} }
} }
other_flavor_id = self.api.post_flavor(other_flavor_body)['id'] other_flavor_id = self.api.post_flavor(other_flavor_body)['id']
# Ignore the create flavor notification
fake_notifier.reset()
post = { post = {
'resize': { 'resize': {

View File

@ -0,0 +1,103 @@
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import copy
import mock
from nova import context
from nova.notifications.objects import flavor as flavor_notification
from nova import objects
from nova.objects import fields
from nova import test
from nova.tests.unit.objects.test_flavor import fake_flavor
class TestFlavorNotification(test.TestCase):
def setUp(self):
self.ctxt = context.get_admin_context()
super(TestFlavorNotification, self).setUp()
@mock.patch('nova.notifications.objects.flavor.FlavorNotification')
def _verify_notification(self, flavor_obj, flavor, action,
mock_notification):
notification = mock_notification
if action == "CREATE":
flavor_obj.create()
elif action == "DELETE":
flavor_obj.destroy()
else:
raise Exception('Unsupported action: %s' % action)
self.assertTrue(notification.called)
event_type = notification.call_args[1]['event_type']
priority = notification.call_args[1]['priority']
publisher = notification.call_args[1]['publisher']
payload = notification.call_args[1]['payload']
self.assertEqual("fake-mini", publisher.host)
self.assertEqual("nova-api", publisher.binary)
self.assertEqual(fields.NotificationPriority.INFO, priority)
self.assertEqual('flavor', event_type.object)
self.assertEqual(getattr(fields.NotificationAction, action),
event_type.action)
notification.return_value.emit.assert_called_once_with(self.ctxt)
schema = flavor_notification.FlavorPayload.SCHEMA
for field in schema:
if field in flavor:
self.assertEqual(flavor[field], getattr(payload, field))
@mock.patch('nova.objects.Flavor._flavor_create')
def test_flavor_create_with_notification(self, mock_create):
flavor = copy.deepcopy(fake_flavor)
flavor_obj = objects.Flavor(context=self.ctxt)
flavor_obj.extra_specs = flavor['extra_specs']
flavorid = '1'
flavor['flavorid'] = flavorid
flavor['id'] = flavorid
mock_create.return_value = flavor
self._verify_notification(flavor_obj, flavor, 'CREATE')
@mock.patch('nova.objects.Flavor._flavor_destroy')
def test_flavor_destroy_with_notification(self, mock_destroy):
flavor = copy.deepcopy(fake_flavor)
flavorid = '1'
flavor['flavorid'] = flavorid
flavor['id'] = flavorid
mock_destroy.return_value = flavor
flavor_obj = objects.Flavor(context=self.ctxt, **flavor)
flavor_obj.obj_reset_changes()
self._verify_notification(flavor_obj, flavor, "DELETE")
def test_obj_make_compatible(self):
flavor = copy.deepcopy(fake_flavor)
flavorid = '1'
flavor['flavorid'] = flavorid
flavor['id'] = flavorid
flavor_obj = objects.Flavor(context=self.ctxt, **flavor)
flavor_payload = flavor_notification.FlavorPayload(flavor_obj)
primitive = flavor_payload.obj_to_primitive()
self.assertIn('name', primitive['nova_object.data'])
self.assertIn('swap', primitive['nova_object.data'])
self.assertIn('rxtx_factor', primitive['nova_object.data'])
self.assertIn('vcpu_weight', primitive['nova_object.data'])
self.assertIn('disabled', primitive['nova_object.data'])
self.assertIn('is_public', primitive['nova_object.data'])
flavor_payload.obj_make_compatible(primitive['nova_object.data'],
'1.0')
self.assertNotIn('name', primitive['nova_object.data'])
self.assertNotIn('swap', primitive['nova_object.data'])
self.assertNotIn('rxtx_factor', primitive['nova_object.data'])
self.assertNotIn('vcpu_weight', primitive['nova_object.data'])
self.assertNotIn('disabled', primitive['nova_object.data'])
self.assertNotIn('is_public', primitive['nova_object.data'])

View File

@ -262,7 +262,8 @@ notification_object_data = {
'EventType': '1.4-da0f0fbcda143ca96c2ac1b93937c22c', 'EventType': '1.4-da0f0fbcda143ca96c2ac1b93937c22c',
'ExceptionNotification': '1.0-a73147b93b520ff0061865849d3dfa56', 'ExceptionNotification': '1.0-a73147b93b520ff0061865849d3dfa56',
'ExceptionPayload': '1.0-27db46ee34cd97e39f2643ed92ad0cc5', 'ExceptionPayload': '1.0-27db46ee34cd97e39f2643ed92ad0cc5',
'FlavorPayload': '1.0-89b17e778291bba22025b5956e072b66', 'FlavorNotification': '1.0-a73147b93b520ff0061865849d3dfa56',
'FlavorPayload': '1.1-e3892169e2c946f6784fe130deaeae4f',
'InstanceActionNotification': '1.0-a73147b93b520ff0061865849d3dfa56', 'InstanceActionNotification': '1.0-a73147b93b520ff0061865849d3dfa56',
'InstanceActionPayload': '1.0-3145ac549217f46e88173c437917ca7a', 'InstanceActionPayload': '1.0-3145ac549217f46e88173c437917ca7a',
'InstanceActionVolumeSwapNotification': 'InstanceActionVolumeSwapNotification':

View File

@ -363,12 +363,14 @@ class _TestFlavor(object):
@mock.patch('nova.objects.Flavor._flavor_destroy') @mock.patch('nova.objects.Flavor._flavor_destroy')
def test_destroy_api_by_id(self, mock_destroy): def test_destroy_api_by_id(self, mock_destroy):
mock_destroy.return_value = dict(fake_flavor, id=123)
flavor = flavor_obj.Flavor(context=self.context, id=123) flavor = flavor_obj.Flavor(context=self.context, id=123)
flavor.destroy() flavor.destroy()
mock_destroy.assert_called_once_with(self.context, flavor_id=flavor.id) mock_destroy.assert_called_once_with(self.context, flavor_id=flavor.id)
@mock.patch('nova.objects.Flavor._flavor_destroy') @mock.patch('nova.objects.Flavor._flavor_destroy')
def test_destroy_api_by_flavorid(self, mock_destroy): def test_destroy_api_by_flavorid(self, mock_destroy):
mock_destroy.return_value = dict(fake_flavor, flavorid='foo')
flavor = flavor_obj.Flavor(context=self.context, flavorid='foo') flavor = flavor_obj.Flavor(context=self.context, flavorid='foo')
flavor.destroy() flavor.destroy()
mock_destroy.assert_called_once_with(self.context, mock_destroy.assert_called_once_with(self.context,

View File

@ -317,7 +317,8 @@ class TestDatabaseAtVersionFixture(testtools.TestCase):
class TestDefaultFlavorsFixture(testtools.TestCase): class TestDefaultFlavorsFixture(testtools.TestCase):
def test_flavors(self): @mock.patch("nova.objects.flavor.Flavor._send_notification")
def test_flavors(self, mock_send_notification):
self.useFixture(conf_fixture.ConfFixture()) self.useFixture(conf_fixture.ConfFixture())
self.useFixture(fixtures.Database()) self.useFixture(fixtures.Database())
self.useFixture(fixtures.Database(database='api')) self.useFixture(fixtures.Database(database='api'))

View File

@ -0,0 +1,4 @@
---
features:
- Support versioned notifications for flavor operations like create and
delete.