Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Kvm on master #316

Draft
wants to merge 61 commits into
base: stable/train
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
f7037a4
[kvm_tacc] Add config keystone DB replication
Dec 2, 2019
dc72dd9
[kvm] Add toggles for blazar and serialconsole
Dec 2, 2019
158e357
[kvm] Remove "create_volume" as default for
Dec 2, 2019
c9712c5
[kvm] Add detection for Neutron options tunnel_types
Dec 2, 2019
ebf172e
[kvm] Add Ceph keyring files.
Dec 5, 2019
496689c
Add ceph volume config to cinder
Dec 18, 2019
93d6765
Fix ceph config in nova
Jan 6, 2020
9a6b883
[kvm] Add encrypted ceph client key files
Feb 20, 2020
9e56d50
Merge remote-tracking branch 'origin/master' into kvm-on-master
codyhammock Apr 24, 2020
e2113c1
Update to allow prometheus server and alertmanager to use haproxy for…
codyhammock May 4, 2020
16e30c2
[kvm] Remove BlazarFilter
codyhammock Sep 9, 2020
19b51bb
[kvm] Correct default volume type
codyhammock Sep 9, 2020
b5dd163
[kvm] Enable federated auth
codyhammock Sep 9, 2020
7405d33
[kvm] Configure Glance image conversion
codyhammock Sep 9, 2020
7d0e3a8
[kvm] More federated auth configs
codyhammock Sep 9, 2020
09aa0b0
[kvm] Ceph configs for Cinder, Glance, Nova
codyhammock Sep 9, 2020
93a87a8
[kvm] Merge from master
codyhammock Sep 17, 2020
711b664
[kvm] Update requirements
codyhammock Sep 17, 2020
2a108f9
[kvm_tacc] Add config keystone DB replication
Dec 2, 2019
61b2a78
[kvm] Add toggles for blazar and serialconsole
Dec 2, 2019
51bfdb4
[kvm] Remove "create_volume" as default for
Dec 2, 2019
592ed0d
[kvm] Add detection for Neutron options tunnel_types
Dec 2, 2019
c6a0038
[kvm] Add Ceph keyring files.
Dec 5, 2019
aafe071
Add ceph volume config to cinder
Dec 18, 2019
ca63ea2
Fix ceph config in nova
Jan 6, 2020
b39adb8
[kvm] Add encrypted ceph client key files
Feb 20, 2020
87dc190
Update to allow prometheus server and alertmanager to use haproxy for…
codyhammock May 4, 2020
90f9a5c
[kvm] Remove BlazarFilter
codyhammock Sep 9, 2020
bd96c02
[kvm] Correct default volume type
codyhammock Sep 9, 2020
960f075
[kvm] Enable federated auth
codyhammock Sep 9, 2020
6bb770c
[kvm] Configure Glance image conversion
codyhammock Sep 9, 2020
919fa84
[kvm] More federated auth configs
codyhammock Sep 9, 2020
b9df671
[kvm] Ceph configs for Cinder, Glance, Nova
codyhammock Sep 9, 2020
389bda6
[kvm] Merge from master
codyhammock Sep 17, 2020
86def66
[kvm] Update requirements
codyhammock Sep 17, 2020
ce11740
[kvm] Merge from master
codyhammock Sep 17, 2020
ea41006
Merge branch 'master' into kvm-on-master
codyhammock Oct 14, 2020
0a5cdeb
[kvm] Fixup cinder.conf if block
codyhammock Nov 3, 2020
08ee346
[keystone] Set project/project_names to optional
Nov 3, 2020
0600d96
[chameleon_usage] add kvm usage report
zhenz Feb 15, 2021
6446b94
Merge pull request #99 from ChameleonCloud/kvm_usage_2
zhenz Feb 18, 2021
8a681fe
Merge branch 'kvm-on-master' of https://github.com/ChameleonCloud/chi…
codyhammock Mar 12, 2021
1e0af34
Adjust requirements for ansible to be more precicely locked to 2.8.x
codyhammock Mar 12, 2021
3c07909
Merge from master branch
codyhammock Mar 31, 2021
f820b08
Add conditionals to bridge_mappings that account for KVM hypervisors
codyhammock Apr 7, 2021
a8b82df
Remove galera.cnf template; no longer necessary because we're no long…
codyhammock Apr 7, 2021
071fa68
[KVM] Enable rbd_flatten_volume_from_snapshot in Cinder
codyhammock Jun 21, 2021
c64c8a0
[kvm] Add galera.cnf to configure table_open_cache
codyhammock Jul 28, 2021
1b27018
Add SSD cinder store
codyhammock Jun 2, 2022
2d3a9fb
Fix up nova for non-baremetal configs
codyhammock Jun 2, 2022
36987f1
disable mitogen
codyhammock Jun 2, 2022
f9a1193
Enable/disable hammers depending on site config
Jun 2, 2022
32e27b4
Use default keystone admin user/pw for hammers
Jun 2, 2022
eb8c8fa
allow disabling hammers
Jun 2, 2022
6f7a1f7
handle dependency drift
msherman64 Jan 9, 2025
061dd59
fix slack alerting
msherman64 Jan 9, 2025
d56f72e
disable caching
msherman64 Jan 9, 2025
65cf750
add missing idp password
msherman64 Jan 9, 2025
080f5d0
fix unset defaults
msherman64 Jan 9, 2025
575417a
print better errors
msherman64 Jan 14, 2025
c80aada
add missing prometheus params
msherman64 Jan 22, 2025
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
20 changes: 6 additions & 14 deletions ansible.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,14 @@
# Ensure that ansible can find roles relative to its working directory
# (instead of looking within playbooks directory or default paths)
roles_path = ./roles:./roles/galaxy.ansible.com
# Turn on fact caching. 'smart' means that if there are no facts found
# for the host, they are fetched the first time. Subsequent reads come
# from the cache.
gathering = smart
fact_caching = jsonfile
fact_caching_connection = .facts
# NOTE(jason): this is only needed for certain sites that need to
# write in to a 'primary' Keystone service when registering endpoints.
# That requires overriding a few specific things in the openstack_auth
# dictionary, without overriding everything.
hash_behaviour = merge
# Use Mitogen for a higher-performance task execution strategy
strategy_plugins = ./venv/lib/mitogen-latest/ansible_mitogen/plugins/strategy
strategy = mitogen_linear

# print better error messages
stdout_callback = yaml

[inventory]
# Ensure we fail if the inventory is malformed; this is important
# for automation, so it does not proceed on failures.
unparsed_is_failed = true

[galaxy]
server = https://old-galaxy.ansible.com/
6 changes: 4 additions & 2 deletions kolla/defaults.yml
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,8 @@ enable_glance: yes
enable_gnocchi: yes

# Hammers
hammers_openstack_user: admin
hammers_openstack_user: "{{ keystone_admin_user }}"
hammers_openstack_password: "{{ keystone_admin_password }}"
hammers_openstack_project_name: "{{ keystone_admin_project }}"

# HAProxy
Expand Down Expand Up @@ -216,13 +217,14 @@ chameleon_portal_mysql_database: chameleon_prod
enable_precis: no

# Prometheus
enable_prometheus: no
enable_prometheus: "{{ inventory_hostname in groups['prometheus'] }}"
prometheus_port: "9090"
prometheus_jupyterhub_exporter_token:
prometheus_server_external_url: "{{ public_protocol }}://{{ prometheus_external_fqdn }}:{{ prometheus_port }}"
prometheus_alertmanager_external_url: "{{ public_protocol }}://{{ prometheus_external_fqdn }}:{{ prometheus_alertmanager_port }}"
# Legacy chameleon_prometheus role vars
prometheus_bind_address: "{{ lookup('vars', 'ansible_' + network_interface).ipv4.address }}"
prometheus_user: prometheus

# Redfish Monitor
redfish_monitor_openstack_user: "{{ keystone_admin_username }}"
Expand Down
29 changes: 28 additions & 1 deletion kolla/node_custom_config/cinder.conf
Original file line number Diff line number Diff line change
@@ -1,2 +1,29 @@
{% if cinder_backend_ceph | bool %}
[DEFAULT]
default_volume_type = iscsi
default_volume_type = ceph-hdd
enabled_backends = rbd-1,rbd-ssd

[rbd-1]
volume_driver = cinder.volume.drivers.rbd.RBDDriver
volume_backend_name = rbd-1
rbd_pool = {{ ceph_cinder_pool_name }}
rbd_ceph_conf = /etc/ceph/ceph.conf
rbd_flatten_volume_from_snapshot = false
rbd_max_clone_depth = 5
rbd_store_chunk_size = 4
rados_connect_timeout = 5
rbd_user = cinder
rbd_secret_uuid = {{ cinder_rbd_secret_uuid }}
report_discard_supported = True
image_upload_use_cinder_backend = True
rbd_flatten_volume_from_snapshot = True
#glance_api_version = 2

[rbd-ssd]
volume_driver = cinder.volume.drivers.rbd.RBDDriver
volume_backend_name = rbd-ssd
rbd_pool = {{ ceph_cinder_ssd_pool_name }}
rbd_user = cinder
rbd_secret_uuid = {{ cinder_rbd_secret_uuid }}
rbd_secret_uuid = {{ cinder_rbd_secret_uuid }}
{% endif %}
9 changes: 9 additions & 0 deletions kolla/node_custom_config/cinder/ceph.client.cinder.keyring
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
$ANSIBLE_VAULT;1.1;AES256
32376162313135653430333733376535633530353862636665373430336236363561623031386531
6134613333303165663363383261623362616338616263640a636561656139663065373861326664
36663965626265666339653166653935313738393730313962353038356464626631326239353738
6365323564396436320a373437336339633233316239653330306564336462646230353730366666
33623461366166323734653533383736613539653934646134356634656531623365623735353836
39373433633961646238363739366536636336323033306236316263346362393933663436333336
38656134363461626461373832663934333333343764323637343763373234656430646564373561
62626631396432353062
17 changes: 17 additions & 0 deletions kolla/node_custom_config/cinder/ceph.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
[global]
log file = /var/log/kolla/ceph/$cluster-$name.log
log to syslog = false
err to syslog = false
log to stderr = false
err to stderr = false

fsid = {{ ceph_fsid }}
mon_initial_members = {{ ceph_mon_hostname }}
mon_host = {{ ceph_mon_address }}
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx

osd pool default size = 1
osd pool default min size = 1

Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
$ANSIBLE_VAULT;1.1;AES256
35626237353166396233653633613766303033663366363635653337306530663361636635333332
3931303337366565393764393430393366663439643663330a333665323833393031366432353062
64323036363838616261356662613135326264373039636331643634623561366133363935613336
6266616332643033360a306262343766643633343266666261343764636263386332376232353532
33626661333963623437383064303565376531656261666166306365366431623464363336626237
31356434363332636435373033353266343735646435643537613937626662366661393764636261
31383062626564663061396464343537303936366531646530393561353763386337626133393864
36646465383765333637
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
$ANSIBLE_VAULT;1.1;AES256
32393735303036616434633236623635326533373536663537393937333465363963383064306432
3063383930333233643937356166386664383862623566370a643736663764306534666334633036
32373738326430313566363630353666636133343333623037373334313531326662623036373965
6136343562326637340a313030323761356263303933363136393230633434356665663035353039
39633737663733666533363461313262656534663933336130393661343561373937363633616233
34383861646632343334393064663362616135393738666536616266303264633330326334636137
62353939666666383439646533346637363435363961316630356333616564656461346365343937
62396235363638376230
2 changes: 2 additions & 0 deletions kolla/node_custom_config/galera.cnf
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
[mysqld]
table_open_cache = 20000
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
$ANSIBLE_VAULT;1.1;AES256
65363435636632386261666565333262316337653864626465663935393361326231636135333131
6463626363393231366161626261363362336262363031620a323331326431666535343335343839
38636362613539356164663835656436376262653034316466363962316437653366646436383636
3866643830376238610a636130363335343730343261346530326337316164613233356263333734
66343536373330313631356332343736303233383636653466346462306666313564323565333935
61653739636333353138373332643838623734623939633564336532636462313963313632656564
32383038663536383430373137393033626636333830383830363133613438623032376162616637
35386633306365323166
7 changes: 7 additions & 0 deletions kolla/node_custom_config/glance/ceph.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
[global]
fsid = {{ ceph_fsid }}
#mon_initial_members = {{ ceph_mon_hostname }}
mon_host = {{ ceph_mon_address }}
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
23 changes: 23 additions & 0 deletions kolla/node_custom_config/glance/glance-api.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
[DEFAULT]
show_image_direct_url = True
client_socket_timeout = 0

[glance_store]
stores = rbd,file
default_store = rbd
rbd_store_pool = kvm-images
rbd_store_user = kvm-images
rbd_store_ceph_conf = /etc/ceph/ceph.conf
rbd_store_chunk_size = 8

[image_import_opts]
image_import_plugins = ['image_conversion']

[image_conversion]
output_format = raw

[keystone_authtoken]
service_token_roles_required = True

[taskflow_executor]
max_workers = 2
5 changes: 5 additions & 0 deletions kolla/node_custom_config/glance/glance-image-import.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
[image_import_opts]
image_import_plugins = ['image_conversion']

[image_conversion]
output_format = raw
8 changes: 1 addition & 7 deletions kolla/node_custom_config/horizon/custom_local_settings
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ CHAMELEON_SITE_ID = '{{ chameleon_site_name }}'
# Hide the region dropdown
OPENSTACK_KEYSTONE_MULTIREGION_SUPPORT = False
# Show the site dropdown
CHAMELEON_MULTISITE_SUPPORT = True
CHAMELEON_MULTISITE_SUPPORT = False
{% else %}
CHAMELEON_SITES = {
{% for conf in horizon_regions %}
Expand Down Expand Up @@ -150,12 +150,6 @@ WEBSSO_DEFAULT_REDIRECT_LOGOUT_CONFIRM_URL = '{{ horizon_chameleon_websso_host }
# A dictionary of settings which can be used to provide the default values for
# properties found in the Launch Instance modal.
LAUNCH_INSTANCE_DEFAULTS = {
'config_drive': False,
'enable_scheduler_hints': True,
'disable_image': False,
'disable_instance_snapshot': True,
'disable_volume': True,
'disable_volume_snapshot': True,
'create_volume': False,
}

Expand Down
8 changes: 8 additions & 0 deletions kolla/node_custom_config/keystone/policy.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#identity:change_password: '!'
#identity:update_user: '!'
#identity:list_endpoints: role:reader and system_scope:all

#identity:list_roles: 'role:reader and system_scope:all'
#identity:list_roles: 'role:reader'

#identity:list_services: role:reader and system_scope:all
6 changes: 3 additions & 3 deletions kolla/node_custom_config/neutron/ml2_conf.ini
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
[agent]
tunnel_types =
tunnel_types = {% if not enable_ironic | bool %}vxlan{% endif %}

[ml2]
mechanism_drivers = openvswitch,genericswitch{% if enable_ironic_neutron_agent | bool %},baremetal{% endif %}
mechanism_drivers = openvswitch{% if neutron_ml2_generic_switch_configs is defined %},genericswitch{%endif %}{% if enable_ironic_neutron_agent | bool %},baremetal{% endif %},l2population

[ml2_type_vlan]
{# DEPRECATED: neutron_network_vlan_ranges still takes priority if in use #}
Expand All @@ -20,7 +20,7 @@ network_vlan_ranges =
{# DEPRECATED: neutron_ovs_bridge_mappings still takes priority if in use #}
{% if neutron_ovs_bridge_mappings is defined %}
bridge_mappings = {{ neutron_ovs_bridge_mappings }}
{% elif neutron_networks is defined %}
{% elif neutron_networks is defined and (inventory_hostname in groups["network"] or (inventory_hostname in groups["compute"] and computes_need_external_bridge | bool )) %}
bridge_mappings = {% for config in neutron_networks %}{{ config.name }}:{{ config.bridge_name }}{% if not loop.last %},{% endif %}{% endfor %}
{% endif %}

Expand Down
69 changes: 53 additions & 16 deletions kolla/node_custom_config/nova.conf
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
[DEFAULT]
# TODO: [jca 2019-02-08]
# This might not be necessary; it is unclear why we have this setting disabled.
vif_plugging_is_fatal = false
vif_plugging_timeout = 0
max_concurrent_builds = 0
# comented -- codyhammock
#vif_plugging_is_fatal = false
#vif_plugging_timeout = 0
#max_concurrent_builds = 0

[compute]
# https://docs.openstack.org/ironic/train/install/configure-compute.html
Expand All @@ -16,31 +17,37 @@ max_concurrent_builds = 0
# compute service, will be remapped to a different one. That may cause
# the second compute service to also be disabled, and so on, until no
# compute services are active.
consecutive_build_service_disable_threshold = 0
# comented -- codyhammock
#consecutive_build_service_disable_threshold = 0

[conductor]
workers = 10

[filter_scheduler]
# Override default filters (just remove filters not relevant to baremetal-only)
# default: AvailabilityZoneFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter,BlazarFilter
enabled_filters = ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,BlazarFilter
# https://docs.openstack.org/ironic/train/install/configure-compute.html
# default: RetryFilter,AvailabilityZoneFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter,BlazarFilter
{% if nova_enabled_filters is defined %}
enabled_filters = {{ nova_enabled_filters }}
{% endif %}
# https://docs.openstack.org/ironic/rocky/install/configure-compute.html
# > Enables querying of individual hosts for instance information.
# Not possible for bare metal nodes, so set it to False.
track_instance_changes = false
# comented -- codyhammock
# track_instance_changes = false
# https://docs.openstack.org/ironic/train/install/configure-compute.html
# > Enabling this option is beneficial as it reduces re-scheduling events
# for ironic nodes when scheduling is based on resource classes,
# especially for mixed hypervisor case with host_subset_size = 1.
# However enabling it will also make packing of VMs on hypervisors
# less dense even when scheduling weights are completely disabled.
shuffle_best_same_weighed_hosts = true
# comented -- codyhammock
# shuffle_best_same_weighed_hosts = true

[neutron]
# Increase timeout for Neutron to reduce probability of error during launches
# of a lot of nodes at once.
timeout = 300
# comented -- codyhammock
#timeout = 300

[oslo_messaging_notifications]
# Experiment Precis requires 2.0 message format, i.e. set driver to messagingv2
Expand All @@ -54,34 +61,42 @@ rpc_conn_pool_size = 300
max_age = 0
until_refresh = 0
reservation_expire = 86400
{% if enable_blazar | bool %}
# Remove quota limits for hosts; these are handled via Blazar
instances = -1
cores = -1
ram = -1
# comented -- codyhammock
#instances = -1
#cores = -1
#ram = -1
{% endif %}
# https://docs.openstack.org/nova/train/configuration/config.html#quota.recheck_quota
# > This defaults to True (recheck quota after resource creation) but can be set
# to False to avoid additional load if allowing quota to be exceeded because
# of racing requests is considered acceptable.
# Disable re-checking because we manage quota in Blazar.
recheck_quota = false
# comented -- codyhammock
#recheck_quota = false

[scheduler]
# TODO: [jca 2019-02-08]
# This seems quite high. We potentially don't need to keep it this high.
# This is the value we have used in the past however.
max_attempts = 50
# comented -- codyhammock
# max_attempts = 50
# https://docs.openstack.org/ironic/train/install/configure-compute.html
# > The recommended value of 2 minutes matches how often the Compute
# service polls the Bare Metal service for node information.
discover_hosts_in_cells_interval = 120
# comented -- codyhammock
# discover_hosts_in_cells_interval = 120

{% if enable_nova_serialconsole_proxy | bool %}
[serial_console]
base_url = wss://{{ kolla_external_fqdn }}:{{ nova_serialproxy_port }}/

{% if nova_console_allowed_origins is defined %}
[console]
allowed_origins = "{{ nova_console_allowed_origins }}"
{% endif %}
{% endif %}

{% if service_name == "nova-api" %}
# Custom vendordata service
Expand All @@ -103,3 +118,25 @@ password = {{ nova_keystone_password }}
os_region_name = "{{ openstack_region_name }}"
{% endif %}
{% endif %}


# TODO: [codyhammock 2019-09-18]
# Override some options that otherwise assume "enable_ceph" is true
{% if nova_compute_virt_type in ['kvm', 'qemu'] %}
[libvirt]
connection_uri = "qemu+tcp://{{ api_interface_address }}/system"
{% if nova_backend == "rbd" %}
images_type = rbd
images_rbd_pool = {{ ceph_nova_pool_name }}
images_rbd_ceph_conf = /etc/ceph/ceph.conf
rbd_user = nova
disk_cachemodes="network=writeback"
{% if nova_hw_disk_discard != '' %}
hw_disk_discard = {{ nova_hw_disk_discard }}
{% endif %}
{% endif %}
{% if nova_backend == "rbd" and external_ceph_cephx_enabled | bool %}
rbd_secret_uuid = {{ rbd_secret_uuid }}
{% endif %}
virt_type = {{ nova_compute_virt_type }}
{% endif %}
16 changes: 16 additions & 0 deletions kolla/node_custom_config/nova/ceph.client.cinder.keyring
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
$ANSIBLE_VAULT;1.1;AES256
38393064616566346637373034336537323933383265653037346662303135326539303331663162
3538613638396465613534323737363337643831653462630a303166363461633235666563646432
38366237316630643335323136656136656362343033623965633234646233626135333366646637
3864623466326164360a613436623236666234663037666633363265333466343663616165613937
65323233653534646337626565393433323139316431613265383930303735373461313839336635
38303566666563366632633733373262323832383732643432633535656462383431356563643264
63666536643732326237643438343830653262626339363637636162656537343039613764636232
63363934643038616633616138353664363939623165623639663936396262663938393430333337
35626662623165646439636536393762373861643666613665333163616538613938653962393538
63393236363034663839366364613637396461663630373836613262336638346330643630666439
61383464363136356135656339343931373835396435636664303839356133396534373563386532
62643361616330363839633234396338613131393137613538313065653430393132333533383561
65306166633063616664393533323132636630386365616362383332393664376335353961323564
31336139313533613835303963633330316664643033373837333538653537383839623233386161
646661346164376131323763303964353664
9 changes: 9 additions & 0 deletions kolla/node_custom_config/nova/ceph.client.nova.keyring
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
$ANSIBLE_VAULT;1.1;AES256
36386335353136303231363762633034353162333864636532323337323038306433643239663562
3338373335353664303733306564366463373736643064660a636634366534303263653232323832
32363466306364303935313561366531656666383633353436333164633730666636353763323932
3434393161316531330a613838336333633835356265313834633936343863386139623039653737
63626262386131663038653466353137386433666136356237643939613762623737343834663464
34326437376433333262323964636136313132626132363739316239653266306232323032616263
30323838353737656665383962333765666666663164663336636466653062626431326236333265
35316232366262353038
Loading
Loading