OpenStack'ten OpenStack'e Göç - Nitelik Göçü


openstacksdk 1.4.0 ve 1.5.0 dahil olmak üzere aşağıda paylaşılan kodun sorunsuz çalışması için bu patchi kendiniz uygulamalısınız.

Newstack tarafında kullanıcımız ve projemiz oluştuğuna göre artık niteliklerimizi göç ettirebiliriz. Nitelikleri göç ettirirken sadece herkese açık olanları değil, sadece spesifik projelere yetkilendirmişleride göç ettirecek ve aynı erişim izinlerinin verilmesini sağlayacağız.

3 adet niteliğimiz bulunmakta, bunlardan 1 tanesi (ID:2795e8b0-e93b-49ae-8e98-2aa08f2b3408) sadece deneme_proj isimli proje tarafından ulaşılabilir halde, yani admin projesi dahil VM oluştururken bu niteliği göremez ve kullanamaz. Sırf bu sebeple listeletirken cli komutumuzun sonuna "--all" eklemek durumundayız.

erdem@EWUL:~$ openstack --os-cloud oldstack flavor list --all
+--------------------------------------+----------------+------+------+-----------+-------+-----------+
| ID                                   | Name           |  RAM | Disk | Ephemeral | VCPUs | Is Public |
+--------------------------------------+----------------+------+------+-----------+-------+-----------+
| 2795e8b0-e93b-49ae-8e98-2aa08f2b3408 | 2CPU_2GB       | 2048 |   10 |         0 |     2 | False     |
| 3244255f-dbde-4406-8125-7b882f1a72c8 | 1CPU_1GB       | 1024 |   10 |         0 |     1 | True      |
| 94dc3438-5f84-43e4-ba54-dc63ef11e1c7 | plain_2CPU_2GB | 2048 |   10 |         0 |     2 | True      |
+--------------------------------------+----------------+------+------+-----------+-------+-----------+

plain_2CPU_2GB isimli niteliğimizde herhangi bir metadata ayar bulunmamakta, yani disk vif vb. limitleri yok. Diğer 2 niteliğimizde bu tip limitler mevcut. Örneğin hem metadatası bulunup hem sadece deneme_proj tarafıdan erişilebilir niteliğimiz oldstack tarafında aşağıdaki gibi görünmekte.

erdem@EWUL:~$ openstack --os-cloud oldstack flavor show 2795e8b0-e93b-49ae-8e98-2aa08f2b3408
| OS-FLV-DISABLED:disabled   | False
| OS-FLV-EXT-DATA:ephemeral  | 0
| access_project_ids         | ['5b656fc728104f97a0d6b8c1e0ac8ed2']
| description                | None
| disk                       | 10
| id                         | 2795e8b0-e93b-49ae-8e98-2aa08f2b3408
| name                       | 2CPU_2GB
| os-flavor-access:is_public | False
| properties                 | quota:disk_read_bytes_sec='20971520',
                               quota:disk_write_bytes_sec='20971520',
                               quota:vif_inbound_burst='12800',
                               quota:vif_inbound_peak='12800',
                               quota:vif_outbound_burst='12800',
                               quota:vif_outbound_peak='12800' 
| ram                        | 2048
| rxtx_factor                | 1.0 
| swap                       | 0   
| vcpus                      | 2   

Nitelik göçü için bir önceki scriptimiz yanında 3_flavor_migration.py adında bir script daha oluşturalım. Başlangıç olarak, daha önce yaptığımız gibi cloud_connection.py scriptinde importları gerçekleştireceğiz. Bu sefer filtreleme işlemlerimiz biraz farklı olacak, ya tüm nitelikleri taşıyalım ya da sadece bir projenin erişim listesinde olan (herkese açık olmayan) nitelikleri taşıyalım şeklinde yaklaşacağız.

Bir nitelik birden fazla proje için erişime açılmış olabilir ve bundan dolayı bu işlemi gerçekleştirmek için nitelik üzerinde herhangi bir erişimi olan bütün projelerin bir önceki aşamada taşınmış olması gerekmektedir.

# --------------------------------------------------------------------------------- #
#   FLAVORS TO / NOT TO MIGRATE
#   If migrate_flavors_of_projects is empty, script migrates every public and private 
#   flavor. If project ID/IDs (oldstack) given, then only the private flavors 
#   accessible to that IDs are migrated
migrate_flavors_of_projects = [
]
#   FLAVORS TO / NOT TO MIGRATE
# --------------------------------------------------------------------------------- #

Filtreleme sonrası sırası ile:

  1. oldstack tarafında bulunan nitelik detaylarını alacağız
  2. newstack tarafında bu detaylar ile nitelik oluşturulacak
  3. oldstack tarafında niteliğe ait extra metadata var ise bunlar newstack tarafına aktarılacak
  4. oldstack tarafında erişim kısıtları var ise bunlar newstack tarafında gerçekleştirilecek

Bu listede verilen her parça kendi numarası ile aşağıdaki kod içerisinde # [X] # şeklinde yorum satırı olarak belirtilmiştir.

for flavor in connold.compute.flavors():

    flavor = flavor.to_dict()
    should_filter = True

    # Check If Flavor Should Migrate 
    if migrate_flavors_of_projects:
        # If migrate_flavors_of_projects is Populated, Flavor Cannot be Public
        if not flavor['is_public']:
            access_list = connold.compute.get_flavor_access(flavor['id'])

            # Check If Flavor Has Access For any migrate_flavors_of_projects IDs
            for m_project in migrate_flavors_of_projects:
                if next((tenant for tenant in access_list if tenant['tenant_id'] == m_project ), False):
                    should_filter = False
                    break
    else:
        should_filter = False

    # Continue Loop
    if should_filter:
        continue

    # [1] # Create New Flavor Details
    c_flavor_attrs = {
        "description":      flavor["description"],
        "disk":             flavor["disk"],
        "ephemeral":        flavor["ephemeral"],
        "is_public":        flavor["is_public"],
        "name":             flavor["name"],
        "ram":              flavor["ram"],
        "rxtx_factor":      flavor["rxtx_factor"],
        "swap":             flavor["swap"],
        "vcpus":            flavor["vcpus"],
    }

    # [2] # Create Flavor W/O Extra Specs
    new_flavor = connnew.compute.create_flavor(**c_flavor_attrs)

    # [3] # If There are Extra Specs Update Those
    if flavor['extra_specs']:
        new_flavor = connnew.compute.create_flavor_extra_specs(new_flavor,flavor['extra_specs'])

    print("-----------------NEW Flavor DETAILS----------------------")
    pp.pprint(new_flavor.to_dict())
    print("---------------------------------------------------------")

    # [4] # Add Access List (If NOT Public)
    if flavor['is_public']:
        continue

    old_access_list = connold.compute.get_flavor_access(flavor['id'])
    for old_access in old_access_list:
        old_project = connold.identity.get_project(old_access['tenant_id'])
        new_project = connnew.identity.find_project(old_project['name'])

        print("-------------------")
        print("Adding Access: ", new_flavor['name'], " to ", "Project: " , new_project['name'])
        new_flavor  = connnew.compute.flavor_add_tenant_access(new_flavor['id'],new_project['id'])
        print("-------------------")

Scriptimizi çalıştırdığımızda çıkışı şu şekilde olacak:

-----------------NEW Flavor DETAILS----------------------
{   'description': None,
    'disk': 10,
    'ephemeral': 0,
    'extra_specs': {   'quota:disk_read_bytes_sec': '20971520',
                       'quota:disk_write_bytes_sec': '20971520',
                       'quota:vif_inbound_burst': '12800',
                       'quota:vif_inbound_peak': '12800',
                       'quota:vif_outbound_burst': '12800',
                       'quota:vif_outbound_peak': '12800'},
    'id': '6304930a-f2ad-46be-9dec-64ab02a57b23',
    'is_disabled': False,
    'is_public': False,
    'location': Munch({'cloud': 'newstack', 'region_name': 'RegionOne', 'zone': None, 'project': Munch({'id': '0a466901b0e14283af568085d07617ca', 'name': 'admin', 'domain_id': None, 'domain_name': 'Default'})}),
    'name': '2CPU_2GB',
    'original_name': None,
    'ram': 2048,
    'rxtx_factor': 1.0,
    'swap': 0,
    'vcpus': 2}
---------------------------------------------------------
-------------------
Adding Access:  2CPU_2GB  to  Project:  deneme_proj
-------------------
-----------------NEW Flavor DETAILS----------------------
{   'description': None,
    'disk': 10,
    'ephemeral': 0,
    'extra_specs': {   'quota:disk_read_bytes_sec': '10485760',
                       'quota:disk_write_bytes_sec': '10485760',
                       'quota:vif_inbound_burst': '12800',
                       'quota:vif_inbound_peak': '12800',
                       'quota:vif_outbound_burst': '12800',
                       'quota:vif_outbound_peak': '12800'},
    'id': 'f145026e-f124-4597-af86-f63cc0d27757',
    'is_disabled': False,
    'is_public': True,
    'location': Munch({'cloud': 'newstack', 'region_name': 'RegionOne', 'zone': None, 'project': Munch({'id': '0a466901b0e14283af568085d07617ca', 'name': 'admin', 'domain_id': None, 'domain_name': 'Default'})}),
    'name': '1CPU_1GB',
    'original_name': None,
    'ram': 1024,
    'rxtx_factor': 1.0,
    'swap': 0,
    'vcpus': 1}
---------------------------------------------------------
-----------------NEW Flavor DETAILS----------------------
{   'description': None,
    'disk': 10,
    'ephemeral': 0,
    'extra_specs': {},
    'id': '18528a45-784e-4247-b77a-f07257e25b12',
    'is_disabled': False,
    'is_public': True,
    'location': Munch({'cloud': 'newstack', 'region_name': 'RegionOne', 'zone': None, 'project': Munch({'id': '0a466901b0e14283af568085d07617ca', 'name': 'admin', 'domain_id': None, 'domain_name': 'Default'})}),
    'name': 'plain_2CPU_2GB',
    'original_name': None,
    'ram': 2048,
    'rxtx_factor': 1.0,
    'swap': 0,
    'vcpus': 2}
---------------------------------------------------------

Cli ile newstack tarafını kontrol edelim, hatta hem metadata hem de erişim kısıtı bulunan niteliğimizi inceleyim.

erdem@EWUL:~$ openstack --os-cloud newstack flavor list --all
+--------------------------------------+----------------+------+------+-----------+-------+-----------+
| ID                                   | Name           |  RAM | Disk | Ephemeral | VCPUs | Is Public |
+--------------------------------------+----------------+------+------+-----------+-------+-----------+
| 18528a45-784e-4247-b77a-f07257e25b12 | plain_2CPU_2GB | 2048 |   10 |         0 |     2 | True      |
| 6304930a-f2ad-46be-9dec-64ab02a57b23 | 2CPU_2GB       | 2048 |   10 |         0 |     2 | False     |
| f145026e-f124-4597-af86-f63cc0d27757 | 1CPU_1GB       | 1024 |   10 |         0 |     1 | True      |
+--------------------------------------+----------------+------+------+-----------+-------+-----------+
erdem@EWUL:~$ openstack --os-cloud newstack flavor show 6304930a-f2ad-46be-9dec-64ab02a57b23
| OS-FLV-DISABLED:disabled   | False
| OS-FLV-EXT-DATA:ephemeral  | 0
| access_project_ids         | ['28683b546d9b4a2e9943810d71ec99cf']
| description                | None
| disk                       | 10
| id                         | 6304930a-f2ad-46be-9dec-64ab02a57b23
| name                       | 2CPU_2GB
| os-flavor-access:is_public | False
| properties                 | quota:disk_read_bytes_sec='20971520',
                               quota:disk_write_bytes_sec='20971520',
                               quota:vif_inbound_burst='12800',
                               quota:vif_inbound_peak='12800',
                               quota:vif_outbound_burst='12800',
                               quota:vif_outbound_peak='12800'
| ram                        | 2048
| rxtx_factor                | 1.0 
| swap                       | 0   
| vcpus                      | 2   

Cli ile listeledik ve erişim kısıtlanmış niteliğimizi inceledik. Her 3 niteliğimiz, bunlara ait metadata ve erişim kısıtları taşınmış. Projemlerimiz ve niteliklierimiz taşındığına göre artık Güvenlik Göçü aşamasına geçip, güvenlik grupları ve bunlara ait kuralları taşıyabiliriz.

OpenStack'ten OpenStack'e Göç:

  1. Yazı Dizisi
  2. Kurulum Bilgileri
  3. Hazırlık
  4. Kullanıcı Göçü
  5. Proje Göçü
  6. Nitelik Göçü
  7. Güvenlik Göçü
  8. Ağ Göçü
  9. Devam Edecek..

Referanslar:

Teşekkür:

Ana fotoğraf: Paolo Bendandi orjinaline Unsplash üzerinden ulaşabilirsiniz.

Previous Next