Tiếp nối phần 1, mình đã nói về việc chỉnh sửa mã nguồn của sahara-dashboard. Quay trở lại với hàm cluster_create của saharadashboard/api/sahara. Hàm này sử dụng python-saharaclient để gửi request tạo cluster tới sahara-api, vì mình sẽ gửi thêm 3 args nữa là is_autoscale, max_cpu và max_ram do vậy cũng cần chỉnh sửa hàm clusters.create của python-saharaclient
Hàm này nằm tại tập tin saharaclient/api/clusters
Thêm các tham số mới
)
Thêm các tham số khi client gửi lên sahara-api

Nếu muốn sử dụng command line để tuơng tác ta có thể sửa tiếp tập tin saharaclient/osc/v1/clusters.py
Tham khảo commit mình đã sửa
- https://github.com/greatbn/python-saharaclient/commit/abb64b76f9900464fbb0f6c274c723b5d8b84a25
- https://github.com/greatbn/python-saharaclient/commit/1885e99061d847c260ebc80794dcef814fdd0501
Vậy là client đã gửi đi các tham số cần thiết, vẫn theo workflow này, ta cũng cần chỉnh sửa sahara-api xử lý các thông tin này và lưu vào database. Ta sẽ cần tạo thêm 3 cột mới trong bảng clusters. Openstack giúp ta việc này rẩt đơn giản bằng cách sử dụng migration đatabase tool là alembic, ta chỉ việc khai báo các cột cần thêm vào bảng nào.
Thêm file 033_add_autoscale.py vào folder sahara/db/migration/alembic_migrations/versions với nội dung như sau:
)
Lưu ý: cần khai báo revision (phiên bản mới ta sẽ sửa), down_revision (phiên bản mà ta sẽ sửa) đúng.
revision = '033'
down_revision = '032'
Tiếp tục thêm các trường mới vào models.py để sahara conductor hiểu được các columns mới trong table clusters
Mở tập tin sahara/db/sqlalchemy/models.py
Sửa class Clusters thêm các trường mới
class Cluster(mb.SaharaBase):
"""Contains all info about cluster."""
__tablename__ = 'clusters'
__table_args__ = (
sa.UniqueConstraint('name', 'tenant_id'),
)
id = _id_column()
name = sa.Column(sa.String(80), nullable=False)
description = sa.Column(sa.Text)
tenant_id = sa.Column(sa.String(36))
trust_id = sa.Column(sa.String(36))
is_transient = sa.Column(sa.Boolean, default=False)
plugin_name = sa.Column(sa.String(80), nullable=False)
hadoop_version = sa.Column(sa.String(80), nullable=False)
cluster_configs = sa.Column(st.JsonDictType())
default_image_id = sa.Column(sa.String(36))
neutron_management_network = sa.Column(sa.String(36))
anti_affinity = sa.Column(st.JsonListType())
management_private_key = sa.Column(sa.Text, nullable=False)
management_public_key = sa.Column(sa.Text, nullable=False)
user_keypair_id = sa.Column(sa.String(80))
status = sa.Column(sa.String(80))
status_description = sa.Column(st.LongText())
info = sa.Column(st.JsonDictType())
extra = sa.Column(st.JsonDictType())
rollback_info = sa.Column(st.JsonDictType())
sahara_info = sa.Column(st.JsonDictType())
use_autoconfig = sa.Column(sa.Boolean(), default=True)
provision_progress = relationship('ClusterProvisionStep',
cascade="all,delete",
backref='cluster',
lazy='joined')
verification = relationship('ClusterVerification', cascade="all,delete",
backref="cluster", lazy='joined')
node_groups = relationship('NodeGroup', cascade="all,delete",
backref='cluster', lazy='joined')
cluster_template_id = sa.Column(sa.String(36),
sa.ForeignKey('cluster_templates.id'))
cluster_template = relationship('ClusterTemplate',
backref="clusters", lazy='joined')
shares = sa.Column(st.JsonListType())
is_public = sa.Column(sa.Boolean())
is_autoscale = sa.Column(sa.Boolean())
max_cpu = sa.Column(sa.Integer())
max_ram = sa.Column(sa.Integer())
is_protected = sa.Column(sa.Boolean())
domain_name = sa.Column(sa.String(255))
Sahara Conductor sẽ xử lý các request tới sahara và ghi vào database, do vậy ta sẽ modify để conductor thêm các dữ liệu mới của chúng ta vào dữ liệu hiện tại mà conductor ghi vào database
Thêm vào hàm cluster_create của sahara/conductor/manager.py như sau

Vậy là conductor sẽ ghi vào database đúng như kì vọng. Nhưng vẫn chưa xong, mỗi khi có request POST gửi lên sahara-api tạo cluster, sahara-api sẽ gọi tới các hàm check dữ liệu này, nếu dữ liệu không theo form đó thì sẽ không thể tạo cluster
)
Tiếp tục chỉnh các template của dữ liệu gửi lên. Mở tập tin sahara/service/validations/cluster_template_schema.py
Sửa dict CLUSTER_TEMPLATE_SCHEMA
Thêm các key và value như sau
)
Về cơ bản là ta đã có thể chạy được code này
- thực hiện tạo virtualenv
- upgrade head database
- run
sahara-apivàsahara-engine - cài đặt mã nguồn
sahara-dashboardmới collectstaticvàcompress
Vậy là mình đã xong 2 bài tản mạn, mô tả lại quá trình modify code sahara của mình, các bạn có thể tham khảo github của mình tại branch stable/ocata
- https://github.com/greatbn/sahara/
- https://github.com/greatbn/sahara-dashboard/
- https://github.com/greatbn/python-saharaclient/