SlideShare uma empresa Scribd logo
1 de 100
Baixar para ler offline
Copyright©2019 NTT corp. All Rights Reserved.
OpenStackアップストリーム活動実践
中級
2019年7月22日(月)
夏目貴史(Takashi Natsume)
NTT ソフトウェアイノベーションセンタ
takashi.natsume.hz@hco.ntt.co.jp
(旧メールアドレス: natsume.takashi@lab.ntt.co.jp)
IRC: takashin
CloudNative Days Tokyo 2019 / OpenStack Days Tokyo 2019
1F3
2Copyright©2019 NTT corp. All Rights Reserved.
• 名前
夏目 貴史(なつめ たかし)
• 所属
• 日本電信電話株式会社ソフトウェアイノベーションセンタ
• 業務
• OpenStackコミュニティ活動(Upstream)
• 主にNovaプロジェクトおよびその関連プロジェクトで活動
• python-novaclientのCore reviewer
• 最近はコンテナ型仮想化関連も
• Kubernetes、他。
• Observability(可観測性)について調査・検証等を行なっています。
• ブログ
• https://medium.com/@natsume.takashi
自己紹介
3Copyright©2019 NTT corp. All Rights Reserved.
1. Novaのプロセス構成
2. 開発フロー
3. REST API
4. CLI
5. ドキュメント
6. テスト(Testing)
7. データベース
8. Versioned Notification
9. セキュリティ
10.Upgrade
11.ConfigオプションとPolicy
12.Backport
13.Pythonパッケージとライブラリ
14.他のプロジェクトとの連携
15.TIPS
アジェンダ
4Copyright©2019 NTT corp. All Rights Reserved.
• 講演の目的
• OpenStackコミュニティに開発者としてより貢献するのに必要な
知識について説明する
• 膨大なドキュメントがある中で、開発者としてより貢献するのに
必要なドキュメントを紹介する
• ドキュメントに書かれていない、ドキュメントどおりには行かな
い事項について説明する。
• 注意事項
• Novaを中心に話しますが、他のプロジェクト(コンポーネント)
では異なる場合があります。
• Novaのソースコードを元に説明する箇所がありますが、以下のバ
ージョンを使用しています。
• masterブランチ
(commit ed49947d5acdc6435e0a76a20b8341228fbe8d27 )
• ドキュメントについては2019年7月16日に参照した内容をベース
に説明します。
はじめに
5Copyright©2019 NTT corp. All Rights Reserved.
Novaのプロセス構成
6Copyright©2019 NTT corp. All Rights Reserved.
Novaを構成するプロセス
図の出典: https://docs.openstack.org/nova/latest/user/cellsv2-layout.html#multiple-cells
複数セル構成時のnovaのプロセス構成
(デフォルトはCell1のみ(Cell0を除く)の単一セル構成)
7Copyright©2019 NTT corp. All Rights Reserved.
• Filter schedulerの仕組みがあるが、Placementを利用
する方向で修正が進んでいる
• Filter schedulerの利用は縮小しており、いくつかの
Scheduling Filterが非推奨(Deprecated)になった
• Placementを呼び出す前にRequest Filterという仕組み
で、Request Specに条件を追加している(そのRequest
Specをもとに作成したResource Requestを使って
Placementに仮想サーバの配置先の候補を問い合わせる)
• nova/scheduler/request_filter.py
• 他にFlavorやImageのPropertyに設定されたtraitは
Resource Requestを作成する以下のメソッドで抽出さ
れる
• resources_from_request_spec(nova/scheduler/utils.py)
Scheduler
8Copyright©2019 NTT corp. All Rights Reserved.
• Placementの呼び出しは以下のクライアントクラスで
実装されている
• nova.scheduler.client.report.SchedulerReportClient
• Placementについても理解する必要がある
• https://docs.openstack.org/placement/latest/
Scheduler (続き)
9Copyright©2019 NTT corp. All Rights Reserved.
開発フロー
10Copyright©2019 NTT corp. All Rights Reserved.
Novaの開発フロー
図の出典: Nova team process
(URLは次ページ)
1. REST API (Compute API)の変更はspecの作成・提出および
承認が必要
2. 機能の追加(削除)はblueprint、Bug修正はBug report
3. 機能の追加はBlueprintとspecの作成・提出および承認が
必要であるが、設計上の議論がない場合(例えば非推奨となった
機能を削除する等)はspecの提出・承認は必要ない
(不要なことはIRC Meeting等で確認する必要がある)。※
※ https://docs.openstack.org/nova/latest/contributor/blueprints.html#specs
図は次ページに続く
11Copyright©2019 NTT corp. All Rights Reserved.
Novaの開発フロー
図の出典: Nova team process
https://docs.openstack.org/nova/latest/contributor/process.html
12Copyright©2019 NTT corp. All Rights Reserved.
• 独立したリポジトリとなっている
(openstack/nova-specs)
• reStructuredTextで記述する(Sphinxでビルドする)
• リリースごとのテンプレートが存在するので、基本的にはそのテ
ンプレートに従い必要事項を記載してGerritでレビュー・承認し
てもらう
• Trainリリース向けspecのテンプレート
• https://specs.openstack.org/openstack/nova-
specs/specs/train/template.html
• 「specs/リリース名/approved」のディレクトリに置く
• 特に注意すべきは「Upgrade Impact」である
• NリリースとN+1リリースの共存はサポートする(ローリング・アップグ
レード可能にする)
• 過去のリリース向けに承認されたspecを再提出する場合は「
Previously-approved: リリース名」のタグをコミット・メッ
セージに入れる
• https://specs.openstack.org/openstack/nova-
specs/readme.html#previously-approved-specifications
• Compute APIの追加・変更を行なう場合は「APIImpact」の
タグをコミット・メッセージに入れる
Nova spec
13Copyright©2019 NTT corp. All Rights Reserved.
Specの例
https://specs.openstack.org/openstack/nova-specs/specs/queens/implemented/cold-migration-with-target-queens.html
14Copyright©2019 NTT corp. All Rights Reserved.
• 以下を参照(Trainリリースの場合)
• https://releases.openstack.org/train/schedule.html
• Novaにおいては最近の傾向として
• milestone-2(train-2)がspecフリーズ(specの承認期限)
• milestone-3(train-3)がfeatureフリーズ(機能追加のパッチ
のマージ期限)
• それ以降は基本的にBug Fixのみ
• クライアント・ライブラリ(python-novaclient)に
ついては、milestone-3でリリースを行なう
リリース・スケジュール
15Copyright©2019 NTT corp. All Rights Reserved.
• Technical Committeeにより各リリースごとに設定
されるOpenStackの全体で取り組む作業項目
• 例: Python 3.5のサポート (Pike)
• TC Goalsと呼ばれることも
• 各プロジェクトにおいて強制力はない(努力目標のよう
なもの)
• https://governance.openstack.org/tc/goals/
index.html
【参考】OpenStack-wide Goals
16Copyright©2019 NTT corp. All Rights Reserved.
• Chronological PTL guide
• https://docs.openstack.org/nova/latest/contributor/ptl
-guide.html
• 時系列でPTLがやるべき作業が記載されている
• Novaプロジェクトの前PTLのMelanie Wittさん作成
【参考】PTLガイド
17Copyright©2019 NTT corp. All Rights Reserved.
REST API
18Copyright©2019 NTT corp. All Rights Reserved.
• REST API (Compute API)を追加・変更する場合(内部の処理
ではなくインタフェース自体の追加・変更)は、まずspecを提案
する
• 追加方法(手順)
1. URLマッピングの追加(必要なら)
• nova/api/openstack/compute/routes.py
2. ポリシーの定義(必要なら)
• nova/policies以下(後述)
3. スキーマ・チェック(JSONリクエスト・ボディ、Queryパラメータ)の
追加・修正
• nova/api/openstack/compute/schemas以下
4. Controllerの追加または修正
• nova/api/openstack/compute以下
5. ユニット・テストの追加
6. Functionalテスト(APIのJSONリクエスト・ボディ、レスポンス・ボデ
ィのサンプルのためのテスト)の追加
7. ドキュメントの修正(後述)
API Reference、API Guide等
https://docs.openstack.org/nova/latest/contributor/api.html
REST APIの追加・変更
19Copyright©2019 NTT corp. All Rights Reserved.
• 後方互換性(Backward compatibility)を維持するた
め、マイクロバージョンの仕組みを採用している。
• https://docs.openstack.org/nova/latest/contributor/mi
croversions.html
• どのような場合にAPIマイクロバージョンを追加する(
Bump、上げる)必要があるかは次ページを参照
API マイクロバージョン
20Copyright©2019 NTT corp. All Rights Reserved.
新しいAPIマイクロバージョンの必要性の判断
図の出典:
https://docs.openstack.org/nova/latest/contributor/microversions.html#when-do-i-need-a-new-microversion
21Copyright©2019 NTT corp. All Rights Reserved.
新しいAPIマイクロバージョンの必要性の判断(続き)
以下のリストも参照
https://docs.openstack.org/nova/latest/contributor/microversions.html#when-do-i-
need-a-new-microversion
レスポンスにおいて以下の場合(フローチャートの記載から漏れている条件)
1. the allowed values of non free form fields
Example: adding a new allowed status to servers/{ID}
2. new headers returned on a response
22Copyright©2019 NTT corp. All Rights Reserved.
• 基本的に前述したフローチャートおよびリストを基に判
断すれば良いが、議論になるケースもある
• 例:レスポンスのBodyで文字列として定義されているが、列挙
型(Enum)ではなく、単に文字列と定義されており、返却さ
れる値の種類が増えるケース
• 追加し(バージョンを上げ)ないこともできるが、追加
可能である
• 新しいAPIマイクロバージョンを追加することにより、
その機能が使用できることをユーザが認識できる
新しいAPIマイクロバージョンの追加
23Copyright©2019 NTT corp. All Rights Reserved.
• OpenStack API Special Interest Group
• http://specs.openstack.org/openstack/api-
wg/index.html
• HTTP Response Codes
• REST APIのレスポンスとしてどのHTTPステータスコードを返
すべきか
• http://specs.openstack.org/openstack/api-
wg/guidelines/http/response-codes.html
REST API 追加・変更の参考情報
24Copyright©2019 NTT corp. All Rights Reserved.
REST API修正(マイクロバージョン追加)の例
https://review.opendev.org/#/c/408964/
Controllerの修正
最新マイクロバージョンの更新と追加したマイクロバージョンの説明の追加
スキーマ・チェックの追加
API Referenceの修正
APIサンプルテストの追加
APIサンプルテストの追加
25Copyright©2019 NTT corp. All Rights Reserved.
CLI
26Copyright©2019 NTT corp. All Rights Reserved.
• APIマイクロバージョンを追加した場合、クライアント
(CLIとPython API bindings)の修正も必要になる
• python-novaclient (novaコマンド)
• python-openstackclient (openstackコマンド)
• Code Review Guide for Novaより
• A new patch for the microversion API change in python-
novaclient side should be submitted before the
microversion change in Nova is merged.
https://docs.openstack.org/nova/latest/contributor/code-
review.html#microversion-api
• python-novaclientからpython-openstackclientへの移行が
コミュニティの基本的な方針が、現在もpython-novaclientへ
の実装は必須である
CLIの追加・修正
27Copyright©2019 NTT corp. All Rights Reserved.
• 追加方法のドキュメント
• Adding support for a new microversion
https://docs.openstack.org/python-
novaclient/latest/contributor/microversions.html
• 手順
1. サポートするAPIマイクロバージョンの定義の修正
2. CLIとPython APIの修正
3. 対応するテストの追加
4. CLIリファレンスの修正
5. Release noteの追加
python-novaclientへのAPIマイクロバージョン対応の追加
28Copyright©2019 NTT corp. All Rights Reserved.
python-novaclientへのAPIマイクロバージョン対応の追加 (続き)
29Copyright©2019 NTT corp. All Rights Reserved.
• 管理者が使うツール
• Placement、Cells V2、データベース関連の操作を行なう
https://docs.openstack.org/nova/latest/cli/nova-
manage.html
• 追加・変更する場合はnova/cmd/manage.pyを修正する
• ドキュメントの更新も忘れずに
• doc/source/cli/nova-manage.rst
nova-manageコマンド
30Copyright©2019 NTT corp. All Rights Reserved.
• nova-status upgrade check
• Upgradeの準備が完了しているかどうかのチェックを行なうコ
マンド
• 前提となるCinderのバージョン
• データベースのレコードの整合性
• データベースのレコードの移行が完了しているか
• ローリング・アップグレードのために必要な設定がされているか
他
• 必要であればnova/cmd/status.pyを修正してチェックを追加
する
• 参考
• ローリング・アップグレードの手順
• https://docs.openstack.org/nova/latest/user/upgrade.htm
l#rolling-upgrade-process
nova-statusコマンド
31Copyright©2019 NTT corp. All Rights Reserved.
ドキュメント
32Copyright©2019 NTT corp. All Rights Reserved.
• Nova doc
• End User、Operator、Contributor(Developer)向けのドキュ
メント
• doc/source以下
• 修正や追加に関連するドキュメントは更新する必要がある
• サポート・マトリックスも
• 新機能追加時は使用方法を追加することも
• API Reference
• APIマイクロバージョンの追加を行なったときは更新する
• API reference guideline
• https://docs.openstack.org/nova/latest/contributor/api-ref-
guideline.html
• API Guide
• Compute API、Novaを構成する要素の概説、用語解説等のドキ
ュメント
• api-guide/source以下
• 修正や追加に関連するドキュメントは更新する必要がある
• Release note(後述)
ドキュメント その1
33Copyright©2019 NTT corp. All Rights Reserved.
• リダイレクト
• ページを移動した(パスを変更した)場合に、外部ドキュメン
トからリンクしている箇所がリンク切れになってしまう
• 移動後のページにリダイレクトさせる
• doc /source/_extra/.htaccessに対象パスとHTTPステータスコ
ード301を返すことと転送先のパスを定義する
• doc /test/redirect-tests.txtに転送の実施の確認用のテストのた
めの行を追加する
• 参考
• https://review.opendev.org/#/c /640730/
• ディレクティブ
• 以下のディレクティブを適切に使用する。
• .. todo::
• .. important::
• .. note::
• .. code-block::
• 他
ドキュメント その2
※ https://docs.openstack.org/nova/latest/contributor/blueprints.htmlからの抜粋
34Copyright©2019 NTT corp. All Rights Reserved.
• 他のプロジェクトのドキュメントの参照
• doc/source/conf.pyのopenstack_projectsに追加する
• stableブランチを持つプロジェクトの
ドキュメントへの参照を適切に変換してくれる。
(master→master、stable→stable)
• ファイルの中では以下のように指定する(Placementの例)
• 例 :placement-doc:`Placement <install/>`
ドキュメント その3
(前略)
openstack_projects = [
'ceilometer',
'cinder',
'glance',
'horizon',
'ironic',
'keystone',
'neutron',
'nova',
'oslo.log',
'oslo.messaging',
'oslo.i18n',
'oslo.versionedobjects',
'placement',
'python-novaclient',
'python-openstackclient',
'watcher’,
]
(後略)
35Copyright©2019 NTT corp. All Rights Reserved.
• Renoというツールを使用する
• https://docs.openstack.org/reno/latest/
• 使用方法
• https://docs.openstack.org/reno/latest/user/usage.html
• 生成されたファイルをgit addして、ファイルを編集して、必要なセクシ
ョンを残して必要な記述を行なう
• 追加すべき場合
• ユーザおよび運用者への影響がある事項
• Compute APIの追加・変更(APIマイクロバージョンの追加)
• CLIの変更(nova-manage、nova-status、novaコマンド等)
• コンピュート・ドライバそのものの追加、既存のものへの機能追加・変更
• セキュリティに関する修正
• アップグレードに伴う変更(configオプションの削除・移行、運用者の対応が
必要なデータベースのスキーマ変更等)
他
• https://docs.openstack.org/nova/latest/contributor/releasenote
s.html#when-a-release-note-is-needed
• 過去のRelease noteも参考にできる
• https://docs.openstack.org/releasenotes/nova/
• https://releases.openstack.org/
Release note
36Copyright©2019 NTT corp. All Rights Reserved.
• OpenStack Documentation
• https://docs.openstack.org/
• 上記のURL以下にあるページから各プロジェクトのイン
ストールガイド、ユーザガイド等をリンクするための設定
やリダイレクトの有効化を行なう
• openstack/openstack-manualsプロジェクト
• www/project-data/latest.yamlで設定
(latest(master)だけでなく、各リリースごとにyamlファイルがある)
• https://docs.openstack.org/doc-contrib-guide/doc-tools/template-
generator.html#project-data-file-format
OpenStack Manuals
(前略)
- name: nova
service: Compute service
service_type: compute
has_api_ref: true
has_api_guide: true
has_install_guide: true
has_config_ref: true
has_admin_guide: true
has_user_guide: true
has_in_tree_htaccess: true
type: service
(後略)
openstack/openstack-manuals
master commit 85aed22318d1a9facd4f74133dc115060c856ae6
37Copyright©2019 NTT corp. All Rights Reserved.
テスト
(Testing)
38Copyright©2019 NTT corp. All Rights Reserved.
• assert文の注意点
• mockのassert文のtypoのためにチェックが正常に行われない
ケースがあるため要注意
• asset_called_once_with
• assertTrue(True, ...
• assertIsNone(None, ...
• assertEqualとすべきところをassertTrueとしている
• assertTrue(2, len(test_list))
Unit Test その1
39Copyright©2019 NTT corp. All Rights Reserved.
• mockの使用
• メソッドのデコレータでmockするメソッド等を定義する
• @mock.patch(...
• @mock.patch.object(...
• テスト対象のメソッドを実行する前にmockを適用したくない
場合の対処法
• mockするメソッド等が1つの場合
• with mock.patch(... または with mock.patch.object(...
• mockするメソッド等が複数の場合
• with test.nestedの利用(nova.test.nested)
• Inner functionの利用
• 変数(定数)へのmockの適用
• 引数のnewを利用する。
• Propertyへのmockの適用
• 引数 new_callable=mock.PropertyMockを利用する
Unit Test その2
(前略)
@mock.patch('nova.db.api.service_get_minimum_version',
return_value={'nova-compute': 2})
def test_create_below_minimum(self, mock_get):
with mock.patch('nova.objects.service.SERVICE_VERSION',
new=1):
self.assertRaises(exception.ServiceTooOld,
objects.Service(context=self.context,
binary='nova-compute',
).create)
(後略)
nova/tests/unit/objects/test_service.py
40Copyright©2019 NTT corp. All Rights Reserved.
Unit Test その3
(前略)
def test_start(self):
params = dict(vm_state=vm_states.STOPPED)
instance = self._create_instance_obj(params=params)
rpcapi = self.compute_api.compute_rpcapi
with test.nested(
mock.patch.object(instance, 'save'),
mock.patch.object(self.compute_api, '_record_action_start'),
mock.patch.object(rpcapi, 'start_instance')
) as (mock_inst_save, mock_record_action, mock_start_instance):
self.compute_api.start(self.context, instance)
self.assertEqual(task_states.POWERING_ON,
instance.task_state)
mock_inst_save.assert_called_once_with(expected_task_state=[None])
mock_record_action.assert_called_once_with(
self.context, instance, instance_actions.START)
mock_start_instance.assert_called_once_with(self.context,
instance)
(後略)
(前略)
def test_instance_set_to_error_on_uncaught_exception(self):
# Test that instance is set to error state when exception is raised.
instance = self._create_fake_instance_obj()
fake_network.unset_stub_network_methods(self)
@mock.patch.object(self.compute.network_api, 'allocate_for_instance',
side_effect=messaging.RemoteError())
@mock.patch.object(self.compute.network_api, 'deallocate_for_instance')
def _do_test(mock_deallocate, mock_allocate):
self.compute.build_and_run_instance(self.context, instance, {},
{}, {}, block_device_mapping=[])
instance.refresh()
self.assertEqual(vm_states.ERROR, instance.vm_state)
self.compute.terminate_instance(self.context, instance, [])
_do_test()
(後略)
with test.nestedの例
nova/tests/unit/compute/test_compute_api.py
Inner functionの例
nova/tests/unit/compute/test_compute.py
41Copyright©2019 NTT corp. All Rights Reserved.
• メソッドの引数の確認
• assert_called_once_with等でメソッドの引数をチェックでき
る
• ただし、あるクラスのインスタンスで、クラスは同じでも違う
インスタンスだとチェックが失敗することがある
• 例えば、nova.context.RequestContext
• その時はnova.test.MatchTypeを使用する
• mock.ANYも使用できるが個人的にお勧めしない
Unit Test その4
(前略)
from nova import test
(中略)
@mock.patch.object(fake.FakeDriver, 'spawn')
def test_on_shared_storage_not_provided_host_with_shared_storage(self,
mock_spawn):
self.stub_out('nova.virt.fake.FakeDriver.instance_on_disk',
lambda *a, **ka: True)
self._rebuild(on_shared_storage=None)
mock_spawn.assert_called_once_with(
test.MatchType(context.RequestContext),
test.MatchType(objects.Instance),
test.MatchType(objects.ImageMeta),
mock.ANY, 'newpass', mock.ANY,
network_info=mock.ANY,
block_device_info=mock.ANY)
(後略)
nova/tests/unit/compute/test_compute.py
42Copyright©2019 NTT corp. All Rights Reserved.
• コードの記述方法(スタイル)のガイドラインが存在す
る
• https://docs.openstack.org/hacking/latest/user/hackin
g.html
• 静的解析ルールによるチェック(後述)があるが、チェ
ックしていないものもある
• 例: importの順序
OpenStack Style Guideline
43Copyright©2019 NTT corp. All Rights Reserved.
• Hacking checkの追加
• pep8(flake8)での静的チェック
• 過去にあった同じ間違いを繰り返さないためにチェックを追加
することが推奨される
• 主に正規表現でチェックを行なうが、正規表現が難しいケース
も存在する。
• 正規表現は可読性を考えることも重要
• ローカルではなく「OpenStack Hacking Style Checks」に
追加することも検討する
• https://opendev.org/openstack/hacking
静的解析ルール(Hacking Check)の追加
44Copyright©2019 NTT corp. All Rights Reserved.
• ルールのドキュメントへの追加
• HACKING.rst
静的解析ルール(Hacking Check)の追加方法
- [N361] Check for usage of deprecated assertRegexpMatches and
assertNotRegexpMatches
次ページへ続く
45Copyright©2019 NTT corp. All Rights Reserved.
• チェック用メソッドの追加と登録
• nova/hacking/checks.py
• 解析ルールのためのユニット・テストの追加
• nova/tests/unit/test_hacking.py
静的解析ルール(Hacking Check)の追加方法 (続き)
(前略)
asse_regexpmatches = re.compile(
r"(assertRegexpMatches|assertNotRegexpMatches)¥(")
(中略)
def assert_regexpmatches(logical_line):
"""Check for usage of deprecated assertRegexpMatches/assertNotRegexpMatches
N361
"""
res = asse_regexpmatches.search(logical_line)
if res:
yield (0, "N361: assertRegex/assertNotRegex must be used instead "
"of assertRegexpMatches/assertNotRegexpMatches.")
(中略)
def factory(register):
(中略)
register(assert_regexpmatches)
(後略)
※ https://review.opendev.org/#/c/613184/
46Copyright©2019 NTT corp. All Rights Reserved.
• ユニット・テストのカバレッジをで以下で取得できる
• tox –e cover
• 分岐網羅 (C1)
テストのカバレッジ
47Copyright©2019 NTT corp. All Rights Reserved.
• Functional Testとは
• https://docs.openstack.org/nova/latest/contributor/testin
g.html#functional-tests
• Unit testやtempestによるOpenStackのコンポーネントが全て
デプロイされた環境へのテストでカバーされない範囲を対象とす
る
• Novaのコードに閉じたテストで、外部コンポーネント(Cinder
、Neutron、Placement等)へのアクセスはスタブを使用して、
novaプロセス間の連携を含めてテストする。
• どのような場合に追加すべきなのか
• はっきりとした基準があるわけではない。
• 必ず追加するケース
• APIマイクロバージョンの追加(APIサンプルの追加)
• Versioned Notificationの追加(Notificationサンプルの追加)
• 必要に応じて追加するケース(だいたい以下のようなケース)
• 複数セルをまたがった処理の追加・修正
• APIデータベースのスキーマ変更
• リグレッションテスト
他
Functional Test
48Copyright©2019 NTT corp. All Rights Reserved.
• Fixtures
• 外部コンポーネント(Cinder、Neutron、Placement他)のスタブ
• ファイル
• nova/tests/fixtures.py
• nova/tests/functional/fixtures.py
• CinderのFixtureの追加例
• https://review.opendev.org/#/c /250283/
Functional Test (続き)
49Copyright©2019 NTT corp. All Rights Reserved.
• Tempest
• The OpenStack Integration Test Suite
• https://docs.openstack.org/tempest/latest/
• Compute APIのレスポンス・スキーマを変更した場
合にはTempestにテストを追加しなければならない
• https://docs.openstack.org/nova/latest/contributor/co
de-review.html#microversion-api
• 追加したパッチの例
• https://review.opendev.org/#/c /467897/
Tempest
50Copyright©2019 NTT corp. All Rights Reserved.
• プロジェクトごとに.zuul.yamlファイルで定義されて
いる
• ただし、ベースとなるJobはopenstack/openstack-zuul-jobs
プロジェクトやopenstack/project-configプロジェクトで定
義されている
• 例外
• masterブランチでしか実行しないJob等は
openstack/project-configプロジェクトに定義する(定義さ
れている)
• Central Config Exceptions
https://docs.openstack.org/infra/manual/creators.html#central-config-
exceptions
ジョブ(check, gate)
(前略)
- project:
name: openstack/nova
templates:
- periodic-jobs-with-oslo-master
- publish-to-pypi
- translation-jobs-master-stable
- api-guide-jobs
- api-ref-jobs
(後略)
openstack/project-configプロジェクト
zuul.d/projects.yaml
commit 69b6379e677a3e11dadbff1795c3796f015f4395
51Copyright©2019 NTT corp. All Rights Reserved.
• Gerritのリンクを辿ると生成されたドキュメントが参
照できるので、そこからチェックできる。
ジョブの結果の見方
API guideのcheck jobは
build-openstack-api-guideである
52Copyright©2019 NTT corp. All Rights Reserved.
データベース
53Copyright©2019 NTT corp. All Rights Reserved.
• データベースは2種類ある(Nova)
• APIデータベース
• セル・データベース
• データベース関連ソースコード
• nova/db以下に存在する
• セル・データベースを参照・更新する操作の追加
• nova/db/api.pyにインタフェース(内部で処理を行なうメソッド
を呼び出すだけのメソッド)を定義する
• nova/db/sqlalchemy/api.pyに処理を行なうメソッドを追加する
• sqlalchemyを使用したSQL操作は他のメソッドを参考に実装できる
• APIデータベースの操作は主にnova/object以下にある各
オブジェクトの中に記述されている
データベース その1
54Copyright©2019 NTT corp. All Rights Reserved.
• アップグレードに伴うスキーマの変更
• 削除(drop)や変更(alter)の操作(subtractive DB
migrations)は基本的に禁止されている(例外あり)
• ユニット・テストでもチェックするようになっている
• https://review.opendev.org/#/c /197349/
• スキーマ変更の実装
• 以下のディレクトリに「数値3桁_名前.py」(例:
373_migration_uuid.py)のファイルを作成して、その中に
upgradeメソッドを実装する。「数値3桁」はそのディレクトリに
あるファイルに付いている数値のうち一番大きな数字に1を足した
ものとする(393が最大なら、394を使用する)
• セル・データベース
• nova/db/sqlalchemy/migrate_repo /versions
• APIデータベース
• nova/db/sqlalchemy/api_migrations /migrate_repo /versions
• テストも実装する
• nova/tests/unit/db/test_migrations.py
• nova/tests/functional/db/api/test_migrations.py
データベース その2
55Copyright©2019 NTT corp. All Rights Reserved.
• アップグレードにともなうDBレコードの変換や補完、整合
性の確保の処理が必要なら、以下に処理を追加する
• オブジェクト
• オブジェクトにおいてDBテーブルから読み込む時は新旧両方に対応す
るとともに、DBテーブルへの保管を行なうときは新しい形式とする
• 変換・補完用コマンド(アップグレード時に実行)
• nova-manage db online_data_migrations
• nova/cmd/manage.pyのDbCommandsクラスのonline_migrationsに追加
https://docs.openstack.org/nova/latest/contributor/code-
review.html#database-schema
• アップグレード時に以下のコマンドでデータベースのスキー
マを変更する
• nova-manage db sync (セル・データベース)
• nova-manage api_db sync (APIデータベース)
• online_data_migrationsを含めた手順の詳細は以下を参照
• https://docs.openstack.org/nova/latest/user/upgrade.html#r
olling-upgrade-process
データベース その3
56Copyright©2019 NTT corp. All Rights Reserved.
Versioned Notification
57Copyright©2019 NTT corp. All Rights Reserved.
• Versioned Notificationとは
• Payloadの要素の追加/削除/変更に合わせてPayloadをバー
ジョン付けした通知の機能
• Legacy notificationからの変換がSteinリリースで完了した。
• Notifications in Nova
• https://docs.openstack.org/nova/latest/reference/notifica
tions.html
• Nova versioned notifications - the result of a 3 year
journey
• https://www.openstack.org/videos/summits/denver-
2019/nova-versioned-notifications-the-result-of-a-3-year-
journey
Versioned Notificationの追加 その1
58Copyright©2019 NTT corp. All Rights Reserved.
• 新規追加方針
• どのタイミングでどういったNotificationを出すといった決ま
りはない(以前ライブ・マイグレーションのNotificationの変
換の時に課題として認識されたがそのまま)
• 非同期の操作(HTTPステータスコード 202 Acceptedが返さ
れる操作)およびDBのレコードの変更を伴うような同期的な操
作の開始/終了(完了)時において通知が発行されるようにな
っている
Versioned Notificationの追加 その2
59Copyright©2019 NTT corp. All Rights Reserved.
1. Notification Payloadクラスの追加
nova/notifications/objects以下に追加する
Versioned Notificationの追加方法 その1
(前略)
@nova_base.NovaObjectRegistry.register_notification
class VolumeUsagePayload(base.NotificationPayloadBase):
# Version 1.0: Initial version
VERSION = '1.0'
SCHEMA = {
'volume_id': ('vol_usage', 'volume_id'),
'project_id': ('vol_usage', 'project_id'),
'user_id': ('vol_usage', 'user_id'),
'availability_zone': ('vol_usage', 'availability_zone'),
'instance_uuid': ('vol_usage', 'instance_uuid'),
'last_refreshed': ('vol_usage', 'last_refreshed'),
'reads': ('vol_usage', 'reads'),
'read_bytes': ('vol_usage', 'read_bytes'),
'writes': ('vol_usage', 'writes'),
'write_bytes': ('vol_usage', 'write_bytes')
}
fields = {
'volume_id': fields.UUIDField(),
'project_id': fields.StringField(nullable=True),
'user_id': fields.StringField(nullable=True),
'availability_zone': fields.StringField(nullable=True),
'instance_uuid': fields.UUIDField(nullable=True),
'last_refreshed': fields.DateTimeField(nullable=True),
'reads': fields.IntegerField(),
'read_bytes': fields.IntegerField(),
'writes': fields.IntegerField(),
'write_bytes': fields.IntegerField()
}
def __init__(self, vol_usage):
super(VolumeUsagePayload, self).__init__()
self.populate_schema(vol_usage=vol_usage)
(後略)
(前略)
@base.NovaObjectRegistry.register
class VolumeUsage(base.NovaPersistentObject, base.NovaObject):
# Version 1.0: Initial version
VERSION = '1.0'
fields = {
'id': fields.IntegerField(read_only=True),
'volume_id': fields.UUIDField(),
'instance_uuid': fields.UUIDField(nullable=True),
'project_id': fields.StringField(nullable=True),
'user_id': fields.StringField(nullable=True),
'availability_zone': fields.StringField(nullable=True),
'tot_last_refreshed': fields.DateTimeField(nullable=True,
read_only=True),
'tot_reads': fields.IntegerField(read_only=True),
'tot_read_bytes': fields.IntegerField(read_only=True),
'tot_writes': fields.IntegerField(read_only=True),
'tot_write_bytes': fields.IntegerField(read_only=True),
'curr_last_refreshed': fields.DateTimeField(nullable=True,
read_only=True),
'curr_reads': fields.IntegerField(),
'curr_read_bytes': fields.IntegerField(),
'curr_writes': fields.IntegerField(),
'curr_write_bytes': fields.IntegerField()
}
(後略)
nova/notifications/objects/volume.py
参考: nova/objects/volume_usage.py
populate_schemaメソッドを呼び出してObject(例ではVolumeUsageオブジェクト)の
フィールドをNotification Payloadのフィールドにセットすることができる。
例: https://review.opendev.org/#/c/580345/
参考: https://docs.openstack.org/nova/latest/reference/notifications.html#how-to-add-a-new-versioned-notification
60Copyright©2019 NTT corp. All Rights Reserved.
2. Notificationクラスの追加
nova/notifications/objects以下に追加する
(Payloadと同じファイル)
Versioned Notificationの追加方法 その2
(前略)
@base.notification_sample('volume-usage.json')
@nova_base.NovaObjectRegistry.register_notification
class VolumeUsageNotification(base.NotificationBase):
# Version 1.0: Initial version
VERSION = '1.0'
fields = {
'payload': fields.ObjectField('VolumeUsagePayload')
}
(後略)
nova/notifications/objects/volume.py
サンプルファイルを指定してdoc/notification_samples以下にそのファイルを追加する。
(doc/notification_samples/volume-usage.json)
1.で作成したNotification Payloadクラスを指定する
61Copyright©2019 NTT corp. All Rights Reserved.
3. Notificationを発行するメソッドの追加
nova/compute/utils.pyに追加
Versioned Notificationの追加方法 その3
(前略)
from nova.objects import fields
(中略)
@rpc.if_notifications_enabled
def notify_about_volume_usage(context, vol_usage, host):
"""Send versioned notification about the volume usage
:param context: the request context
:param vol_usage: the volume usage object
:param host: the host emitting the notification
"""
payload = volume_notification.VolumeUsagePayload(
vol_usage=vol_usage)
notification = volume_notification.VolumeUsageNotification(
context=context,
priority=fields.NotificationPriority.INFO,
publisher=notification_base.NotificationPublisher(
host=host, source=fields.NotificationSource.COMPUTE),
event_type=notification_base.EventType(
object='volume',
action=fields.NotificationAction.USAGE),
payload=payload)
notification.emit(context)
(後略)
優先度をセット
(AUDIT, CRITICAL, DEBUG, INFO,
ERROR, WARN)
Notificationを発行するNovaのプロセスをセット
(API, COMPUTE, CONDUCTOR,
SCHEDULER, 他)
Actionをセット
(UPDATE, DELETE, CREATE, 他)
phaseがある場合は、phaseをセット
(START, END, ERROR)
phase=fields.NotificationPhase.START
configオプションでversioned notificationが
有効になっていなければ
メソッドの実行をスキップする。
必ず追加する。
nova/compute/utils.py
62Copyright©2019 NTT corp. All Rights Reserved.
4. Notificationを発行するメソッド(3.)を対象操作(
処理)に入れる
Versioned Notificationの追加方法 その4
(前略)
def _notify_volume_usage_detach(self, context, instance, bdm):
(中略)
vol_usage = objects.VolumeUsage(context)
vol_usage.volume_id = bdm.volume_id
vol_usage.instance_uuid = instance.uuid
vol_usage.project_id = instance.project_id
vol_usage.user_id = instance.user_id
vol_usage.availability_zone = instance.availability_zone
vol_usage.curr_reads = rd_req
vol_usage.curr_read_bytes = rd_bytes
vol_usage.curr_writes = wr_req
vol_usage.curr_write_bytes = wr_bytes
vol_usage.save(update_totals=True)
(中略)
compute_utils.notify_about_volume_usage(context, vol_usage, self.host)
(後略)
nova/compute/manager.py
63Copyright©2019 NTT corp. All Rights Reserved.
5. サンプルファイルのためのFunctional Testの追加
Versioned Notificationの追加方法 その5
(Unit TestとRelease noteも追加する)
(前略)
class TestVolumeUsageNotificationSample(
notification_sample_base.NotificationSampleTestBase):
(中略)
def test_volume_usage_with_detaching_volume(self):
server = self._setup_server_with_volume_attached()
self.api.delete_server_volume(server['id'],
self.cinder.SWAP_OLD_VOL)
self._wait_for_notification('instance.volume_detach.end')
# 0. volume_detach-start
# 1. volume.usage
# 2. volume_detach-end
self.assertEqual(3, len(fake_notifier.VERSIONED_NOTIFICATIONS))
self._verify_notification(
'volume-usage',
replacements={'instance_uuid': server['id']},
actual=fake_notifier.VERSIONED_NOTIFICATIONS[1])
(後略)
nova/tests/functional/notification_sample_tests/test_volume.py
doc/notification_samples/volume-usage.jsonを指定
64Copyright©2019 NTT corp. All Rights Reserved.
セキュリティ
65Copyright©2019 NTT corp. All Rights Reserved.
• ログやノーティフィケーションの出力
• センシティブな情報(パスワード等)はマスクする
• oslo.uitlsのoslo_utils.strutils.mask_passwordを利用してマス
クする
• 特定のキーを持つDictを文字列にしたものを対象に置換を行なう
• 以下(oslo.utilsのmaster)を参照
https://opendev.org/openstack/oslo.utils/src /commit/3ed4676f93996b
9f1d81a2826020d0c8cead4425/oslo_utils/strutils.py#L58-L62
• Fixの例
• https://review.opendev.org/#/c /558694/
• あるいはそもそも出力しない
• Fixの例
• https://review.opendev.org/#/c /649775/
• データベースやメッセージング・ミドルウェアへの接続用URI(文
字列)は要注意
セキュリティ
66Copyright©2019 NTT corp. All Rights Reserved.
• セキュリティを確保するための仕組み
• 限られたコマンドしかroot権限で実行できないようにする
• 例: ファイルシステム関連(mount、mkfs等)
• 以前はroot.wrapsという仕組みだったが、privsepに置
き換えられる(Novaでは現在進行中)
• oslo.privsepというライブラリが用意されている
• nova/privsep以下にコマンド(
oslo_concurrency.processutils.execute等)の呼び
出しが集約されている
• 参考ドキュメント
• Spec
• https://specs.openstack.org/openstack/oslo-
specs/specs/liberty/privsep.html
• 使用方法
• https://docs.openstack.org/oslo.privsep/latest/user/index.
html
• プロジェクトへの新規追加方法(ブログ)
• https://www.madebymikal.com/adding-oslo-privsep-to-a-
new-project-a-worked-example/
Privsep (Privilege Separation Daemon)
67Copyright©2019 NTT corp. All Rights Reserved.
Upgrade
68Copyright©2019 NTT corp. All Rights Reserved.
• oslo.versionedobjects
• https://docs.openstack.org/oslo.versionedobjects/lates
t/
• オブジェクト
• 仮想サーバ(Instance)、フレーバ(Flavor)などが持つ属性
と操作(状態変更、DBの更新等)を1つのクラスにまとめて(
オブジェクトとして)扱っている
• oslo.versionedobjectsの
oslo_versionedobjects.base.VersionedObjectを継承する
オブジェクトを利用(基底クラスとしてNovaObjectクラスが
定義されている)
• ローリング・アップグレードの際に異なるバージョン(
NとN+1)のnovaプロセスが稼働することに対応させ
るためバージョン付けされている
oslo.versionedobjects
69Copyright©2019 NTT corp. All Rights Reserved.
• オブジェクトへの属性・操作(メソッド)の追加・変更
• 基本的に以下の場合はバージョンを上げなければならない(ただし
例外あり)
• リモータブルなメソッドの追加・変更
• @base.remotable
• @base.remotable_classmethod
• 属性(フィールド)の追加・変更
• obj_make_compatibleの実装
• lazy-loadableなフィールドを追加したなら、obj_load_attrメソ
ッドの実装
• 他にも修正が必要
• テストの対応
• 上記の変更を行なった場合は、オブジェクトのハッシュ値(
Signature)が変更される
• ハッシュ値(とバージョン)をテストに反映させる
• nova/tests/unit/objects/test_objects.pyの「object_data」を更
新する
• 参考
• https://docs.openstack.org/nova/latest/contributor/code-
review.html#object-versions
oslo.versionedobjects (続き)
70Copyright©2019 NTT corp. All Rights Reserved.
• Novaのプロセス間の呼び出し
• メッセージング・ミドルウェア(RabbitMQ等)を利用したプロセ
ス間の呼び出し
• call(返答を待つ=同期)とcast(一方通行=非同期)の2種類が
ある
• RPCにはバージョンが存在する
• ローリング・アップグレードのため(NとN+1バージョンの同時稼
働のため)
• Managerのメソッド自体の追加、メソッドのシグネチャの変更が
あった場合は、マイナー・バージョンを上げる
(Managerのメソッド自体を削除する場合はメジャー・バージョ
ンを上げる)
• RPC APIに後方互換性の処理を入れる
• can_send_versionで送信可能なバージョンをチェックして後方互換
性の処理を入れる
• Manager(要求を受ける側、各プロセス(nova-conductor、
nova-scheduler、nova-compute等))
• 各クラスにおいてmessaging.Targetで対応しているバージョンが定
義されている
• 例: target = messaging.Target(version='5.1')
RPC
71Copyright©2019 NTT corp. All Rights Reserved.
• RPC関連ファイル
• RPC API
• nova/scheduler/rpcapi.py
• nova/conductor/rpcapi.py
• nova/compute/rpcapi.py
• Manager
• nova/scheduler/manager.py
• nova/conductor/manager.py
• nova/compute/manager.py
• RPCのバージョンを上げた修正の例
• https://review.opendev.org/#/c/582417/
• 参考
• https://docs.openstack.org/nova/latest/contributor/co
de-review.html#rpc-api-versions
RPC (続き)
72Copyright©2019 NTT corp. All Rights Reserved.
• サービス・バージョンとは
• nova-computeがサポートしているCompute RPCのバージョ
ンやサポートしている機能を表す
• nova/objects/service.pyのSERVICE_VERSIONで定義
• どのような時に上げるのか
• Compute RPCのバージョンを上げた場合
• nova-computeにおいて機能を追加した場合
• 操作対象の仮想サーバの存在するCompute Nodeで操作可能かチ
ェックしてエラーを返す(アップグレードで異なるバージョンの
nova-computeが混在しているケースを想定)
• 例は次ページ
サービス・バージョン
(前略)
# NOTE(danms): This is the global service version counter
SERVICE_VERSION = 37
(後略)
73Copyright©2019 NTT corp. All Rights Reserved.
• Compute: add support to abort queued live migration
• https://review.opendev.org /#/c /568542/
• API: add support to abort queued live migration in microversion 2.65
• https://review.opendev.org /#/c /573136/
サービス・バージョンのアップの例
(前略)
MIN_COMPUTE_ABORT_QUEUED_LIVE_MIGRATION = 34
(中略)
@profiler.trace_cls("compute_api")
class API(base.Base):
(中略)
@check_instance_lock
@check_instance_state(task_state=[task_states.MIGRATING])
def live_migrate_abort(self, context, instance, migration_id,
support_abort_in_queue=False):
"""Abort an in-progress live migration.
(中略)
if migration.status in queued_states:
service = objects.Service.get_by_compute_host(
context, instance.host)
if service.version < MIN_COMPUTE_ABORT_QUEUED_LIVE_MIGRATION:
raise exception.AbortQueuedLiveMigrationNotYetSupported(
migration_id=migration_id, status=migration.status)
allowed_states.extend(queued_states)
(後略)
nova/compute/api.py
74Copyright©2019 NTT corp. All Rights Reserved.
• 非推奨
• Compute API (REST API)、Config option、Policy等
• 手順
• 非推奨とする
• Compute API
• あるマイクロバージョン以降は404 (Not Found)が返るようにする
• API Referenceに非推奨であることを明記する
• Release noteのdeprecationsセクションに記述する
• 例: https://review.opendev.org/#/q/topic:bp/deprecate-api-
proxies+status:merged
• CLI、configオプション、他
• 非推奨であることの設定(configオプションなら、deprecated_sinceや
deprecated_reason等の追加)や記述を行なう
• 非推奨であることの警告メッセージをログ等に出力させる
• ドキュメントに非推奨であることを明記する
• Release noteのdeprecationsセクションに記述する
• 次リリース以降に削除する
• 関連箇所、関連ファイルを削除する
• Release noteのupgradeセクションに記述する
• Compute APIの場合はHTTPレスポンスコード 410 (Gone)を返すよう
にする
• 例: https://review.opendev.org/#/c /582943/
(https://review.opendev.org/#/q/topic:bp/remove-nova-
network+status:merged)
非推奨の警告(Deprecation Warning)
参考: Policyのdeprecationの例
https://review.opendev.org/#/c/465505/
75Copyright©2019 NTT corp. All Rights Reserved.
非推奨への変更の例
非推奨の設定を行なう
conf: Deprecate ‘keymap’ options https://review.opendev.org/#/c/483994/
76Copyright©2019 NTT corp. All Rights Reserved.
非推奨への変更の例(続き)
警告をログに出力する
77Copyright©2019 NTT corp. All Rights Reserved.
ConfigオプションとPolicy
78Copyright©2019 NTT corp. All Rights Reserved.
• Configオプション(nova.confで設定するオプション
)の定義は、nova/confディレクトリ以下に集約され
ている
• 追加方法は次ページ以降
• 参考
• https://docs.openstack.org/nova/latest/contributor/co
de-review.html#config-options
Configオプションの追加・修正
79Copyright©2019 NTT corp. All Rights Reserved.
Configオプションの追加 その1
(前略)
from oslo_config import cfg
(中略)
zvm_opt_group = cfg.OptGroup('zvm',
title='zVM Options',
help="""
zvm options allows cloud administrator to configure related
z/VM hypervisor driver to be used within an OpenStack deployment.
zVM options are used when the compute_driver is set to use
zVM (compute_driver=zvm.ZVMDriver)
""")
zvm_opts = [
cfg.URIOpt('cloud_connector_url',
sample_default='http://zvm.example.org:8080/',
help="""
URL to be used to communicate with z/VM Cloud Connector.
"""),
cfg.StrOpt('ca_file',
default=None,
help="""
CA certificate file to be verified in httpd server with TLS enabled
A string, it must be a path to a CA bundle to use.
"""),
(中略)
]
def register_opts(conf):
conf.register_group(zvm_opt_group)
conf.register_opts(zvm_opts, group=zvm_opt_group)
def list_opts():
return {zvm_opt_group: zvm_opts}
1. nova/conf以下にファイルを追加し(必要な場合)、その中にオプションのグループとオプションを定義する。
既に適切なファイル(適切なオプションのグループ)がある場合は、その中にオプションを追加する。
オプションのグループの定義
(例はnova.confだとzvmセクションになる。)
オプションを定義する。
定義方法は以下を参照
https://docs.openstack.org/oslo.config/latest/reference/defining.html
参考: https://review.opendev.org/#/c/523387/
nova/conf/zvm.py
次ページ
tox -e genconfigでサンプルconfigファイルを出力するためのメソッド
setup.cfgの解説参照
80Copyright©2019 NTT corp. All Rights Reserved.
2. 初期化(モジュールのimport)時に登録する処理の追加
Configオプションの追加 その2
nova/conf/__init__.py
(前略)
from nova.conf import zvm
(中略)
zvm.register_opts(CONF)
(後略)
81Copyright©2019 NTT corp. All Rights Reserved.
3. Configオプションを使用する
Configオプションの追加 その3
nova/virt/zvm/driver.py
(前略)
from nova import conf
(中略)
CONF = conf.CONF
(中略)
class ZVMDriver(driver.ComputeDriver):
(中略)
def __init__(self, virtapi):
super(ZVMDriver, self).__init__(virtapi)
self._validate_options()
self._hypervisor = hypervisor.Hypervisor(
CONF.zvm.cloud_connector_url, ca_file=CONF.zvm.ca_file)
LOG.info("The zVM compute driver has been initialized.")
(後略)
82Copyright©2019 NTT corp. All Rights Reserved.
• 定義はnova/policies以下に集約されている
• REST APIの処理のなかでcontext.can(nova.context.
RequestContextクラスのcanメソッド)を呼び出して認
可を確認している
(内部でnova/policy.pyのauthorizeメソッドを呼び出し
ている)
• authorizeメソッド内の初期化処理(initメソッドの呼び出
し)でEnforcerへのポリシー・ルールの登録が行なわれて
いる。
• 登録するポリシー・ルールの取得は
nova/policies/__init__.pyのlist_rulesメソッド(
nova.policies.list_rules)を呼び出している。
• nova/policies/base.pyに以下の定数が定義されている。
• RULE_ADMIN_OR_OWNER
• RULE_ADMIN_API
• RULE_ANY
Policyの追加・修正
83Copyright©2019 NTT corp. All Rights Reserved.
1. nova/policies以下にファイルを追加し(必要な場合)、その中にポリシーを定義する。
既に適切なファイル(適切なポリシーの組)がある場合は、その中にポリシーを追加する。
Policyの追加 その1
(前略)
from oslo_policy import policy
from nova.policies import base
POLICY_ROOT = 'os_compute_api:os-server-groups:%s'
server_groups_policies = [
policy.DocumentedRuleDefault(
POLICY_ROOT % 'create',
base.RULE_ADMIN_OR_OWNER,
"Create a new server group",
[
{
'path': '/os-server-groups',
'method': 'POST'
}
]
),
(中略)
]
def list_rules():
return server_groups_policies
nova/policies/server_groups.py
詳細は以下を参照のこと。
https://docs.openstack.org/oslo.policy/latest/user/usage.html#registering-policy-defaults-in-code
84Copyright©2019 NTT corp. All Rights Reserved.
• ポリシーのルール一覧取得メソッドへの追加
Policyの追加 その2
(前略)
from nova.policies import server_groups
(中略)
def list_rules():
return itertools.chain(
(中略)
server_groups.list_rules(),
(中略)
)
nova/policies/__init__.py
85Copyright©2019 NTT corp. All Rights Reserved.
• Configファイル生成、Policyファイル生成、コマンド(プロセ
ス、例えばnova-api、nova-compute)の「エントリー・ポ
イント」([entry_points])他が定義されている
• console_scripts(pbr(※)によるPythonスクリプトの生成)
• oslo.config.opts
• tox –e genconfigでnova.confのサンプルを出力する時にconfigの一覧を
取得するメソッドを設定
• https://docs.openstack.org/oslo.config/latest/cli/generator.html
#defining-option-discovery-entry-points
• oslo.policy.policies
• tox –e genpolicyでpolicy.yamlのサンプルを出力する時にpolicyの一覧
を取得するメソッドを設定
• https://docs.openstack.org/oslo.policy/latest/user/usage.html#s
ample-file-generation
setup.cfg
(前略)
console_scripts =
nova-api = nova.cmd.api:main
(後略)
※ https://docs.openstack.org/pbr/latest/
86Copyright©2019 NTT corp. All Rights Reserved.
Backport
87Copyright©2019 NTT corp. All Rights Reserved.
• 新機能(Blueprint)は基本的にbackportしない
(Bug Fixで重要度が高いものが中心)
• 基本的にはmasterにmergeして、より新しいstable
ブランチから順にbackportする
• 例外的にstableブランチのみにパッチが提出・適用さ
れる場合がある
• Clean backportできるケースもあるが、Conflictが
発生して、そのままではbackportできないケースもあ
る
• masterでのパッチ作成時にBugの重要度から
backportの要否を検討してBackportしやすいように
作成することも重要
Stableブランチへのbackport
88Copyright©2019 NTT corp. All Rights Reserved.
Commit messageの例(stable/rockyへのbackport)
Fix resetting non-persistent fields when saving obj
The 'requested_destination', 'network_metadata', 'retry' fields
in the RequestSpec object are reset when saving the object currently.
(中略)
So make them not be reset when saving the object.
Conflicts:
nova/objects/request_spec.py
nova/tests/unit/objects/test_request_spec.py
Conflicts are due to not including the following changes in rocky.
I53e5debcffd6de2b3a2ff838e7f5da33fa1a82b8
Idaed39629095f86d24a54334c699a26c218c6593
Change-Id: I2131558f0edfe603ee1e8d8bae66a3caf5182a58
Closes-Bug: #1815153
(cherry picked from commit 67d5970445818f2f245cf1b6d9d46c36fb220f04)
Conflictが起きたファイルとその理由を書く
※ https://review.opendev.org/#/c/643215/
Change-Idはmasterと同じIDとする
master、対象のstable branchよりも
新しいstable branchのcommit IDを
記載する。
89Copyright©2019 NTT corp. All Rights Reserved.
Pythonパッケージとライブラリ
90Copyright©2019 NTT corp. All Rights Reserved.
• 必要なPythonのパッケージ(PyPI)のバージョンを定義
• グローバルな(OpenStackプロジェクト全体の)定義が存
在する
• Requirementsプロジェクト
• https://docs.openstack.org/requirements/latest/
• https://opendev.org/openstack/requirements
• ローカル(Nova)の定義ファイル
• グローバルの定義と整合性を取る必要がある
• requirements.txt
• Novaのプロセスが稼働するのに必要なパッケージの情報を定義
• test-requirements.txt
• テストを実行するために必要なパッケージの情報を定義
• doc/requirements.txt
• ドキュメント生成に必要なパッケージの情報を定義
• lower-constraints.txt
• 必要なパッケージのバージョンの下限を定義
• 上記3つのファイルの下限に合わせて更新する
requirements
91Copyright©2019 NTT corp. All Rights Reserved.
• 共通ライブラリとしてOsloがある
• oslo.utils
• oslo.config
他(数多くあります)
• 共通ライブラリを利用するように修正する
• OpenStackのプロジェクトで重複したコードを持たないように
するため
• 貢献するには
• osloのリリースを新機能をウォッチして適用できないか検討す
る
• Gerritにpushされた他のプロジェクトのパッチを参考にする
Osloの利用
92Copyright©2019 NTT corp. All Rights Reserved.
Oslo利用の例
https://review.opendev.org/#/c/466201/
93Copyright©2019 NTT corp. All Rights Reserved.
他のプロジェクトとの連携
94Copyright©2019 NTT corp. All Rights Reserved.
• Novaは主に以下のプロジェクトと連携している
• Keystone
• nova/utils.pyのget_ksa_adapterメソッドに注目
他
• Placement
• (ここでは省略)
• Neutron
• nova/network/neutronv2以下
• Glance
• nova/image以下
• Cinder
• nova/volume以下
• Ironic
• nova/virt/ironic以下
• Cyborg(予定)
• Request ID
• 各プロジェクトへのクライアントからのリクエスト送信時にGlobal
Request IDをHTTPリクエストヘッダにセットする
• 参考
• https://review.opendev.org/#/q/topic:bug/1734625
他のプロジェクトの連携
95Copyright©2019 NTT corp. All Rights Reserved.
TIPS
96Copyright©2019 NTT corp. All Rights Reserved.
• git blame ファイルのパス
• そのファイルにある行ごとにその行を変更したCommit(
Commit ID)が分かる
• ただし、現在存在しない行(削除されてしまった行)がどの
Commitで削除されたかは分からない
• 例: git blame nova/compute/api.py
• git log -S 文字列
• 指定した文字列を含む現在存在しない行(削除されてしまった
行)がどのCommitで削除されたか見つけるために使用できる
• Sオプション
• Look for differences that change the number of occurrences of the
specified string (i.e. addition/deletion) in a file. Intended for the
scripter’s use.(man git logより)
• 文字列にマッチする行の追加や削除があったパッチを見る
Gitコマンド
97Copyright©2019 NTT corp. All Rights Reserved.
• Hound(OpenStack Code Search)
• OpenStack関連プロジェクトの横断的な検索
• http://codesearch.openstack.org/
• Paste
• ログやコマンドの出力を貼り付けて使用することにより、レビ
ューのコメント作成に役立つ
• http://paste.openstack.org/
• Github
• Commit IDと行を指定してソースコードの該当箇所を示す
• 例えば
https://github.com/openstack/nova/blob/ed49947d5ac
dc6435e0a76a20b8341228fbe8d27/nova/compute/api.
py#L1794-L1808
便利ツール
98Copyright©2019 NTT corp. All Rights Reserved.
• tox(tox.ini)
• bindep
• https://docs.openstack.org/infra/bindep/readme.html
• Nova固有の事項
• Compute Driver
• Cells V2
この資料にはないが理解が必要なこと
99Copyright©2019 NTT corp. All Rights Reserved.
• ソースコードを読もう!
• 他の人のPatchのレビューを行なうことも推奨
• 関係する他のプロジェクトのリポジトリも覗いてみよう
(特にosloライブラリ)
• 読んでいれば見えてくるものがある
• ソースコードを書いてPatchをGerritにpushして貢献
しよう!
• そして、より高いレベルでのコミュニティへの貢献を目
指そう!
最後に
100Copyright©2019 NTT corp. All Rights Reserved.
ご清聴ありがとうございました

Mais conteúdo relacionado

Mais procurados

OpenStackで始めるクラウド環境構築入門
OpenStackで始めるクラウド環境構築入門OpenStackで始めるクラウド環境構築入門
OpenStackで始めるクラウド環境構築入門VirtualTech Japan Inc.
 
#logstudy 01 rsyslog入門
#logstudy 01 rsyslog入門#logstudy 01 rsyslog入門
#logstudy 01 rsyslog入門Takashi Takizawa
 
Machine configoperatorのちょっとイイかもしれない話
Machine configoperatorのちょっとイイかもしれない話 Machine configoperatorのちょっとイイかもしれない話
Machine configoperatorのちょっとイイかもしれない話 Toshihiro Araki
 
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)NTT DATA Technology & Innovation
 
Pacemakerを使いこなそう
Pacemakerを使いこなそうPacemakerを使いこなそう
Pacemakerを使いこなそうTakatoshi Matsuo
 
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)NTT DATA Technology & Innovation
 
どうやって決める?kubernetesでのシークレット管理方法(Cloud Native Days 2020 発表資料)
どうやって決める?kubernetesでのシークレット管理方法(Cloud Native Days 2020 発表資料)どうやって決める?kubernetesでのシークレット管理方法(Cloud Native Days 2020 発表資料)
どうやって決める?kubernetesでのシークレット管理方法(Cloud Native Days 2020 発表資料)NTT DATA Technology & Innovation
 
NGINX Back to Basics: Ingress Controller (Japanese Webinar)
NGINX Back to Basics: Ingress Controller (Japanese Webinar)NGINX Back to Basics: Ingress Controller (Japanese Webinar)
NGINX Back to Basics: Ingress Controller (Japanese Webinar)NGINX, Inc.
 
「Neutronになって理解するOpenStack Network」~Neutron/Open vSwitchなどNeutronと周辺技術の解説~ - ...
「Neutronになって理解するOpenStack Network」~Neutron/Open vSwitchなどNeutronと周辺技術の解説~  - ...「Neutronになって理解するOpenStack Network」~Neutron/Open vSwitchなどNeutronと周辺技術の解説~  - ...
「Neutronになって理解するOpenStack Network」~Neutron/Open vSwitchなどNeutronと周辺技術の解説~ - ...VirtualTech Japan Inc.
 
アーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーションアーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーションMasahiko Sawada
 
SR-IOV Networking in OpenStack - OpenStack最新情報セミナー 2016年3月
SR-IOV Networking in OpenStack - OpenStack最新情報セミナー 2016年3月SR-IOV Networking in OpenStack - OpenStack最新情報セミナー 2016年3月
SR-IOV Networking in OpenStack - OpenStack最新情報セミナー 2016年3月VirtualTech Japan Inc.
 
CyberAgent における OSS の CI/CD 基盤開発 myshoes #CICD2021
CyberAgent における OSS の CI/CD 基盤開発 myshoes #CICD2021CyberAgent における OSS の CI/CD 基盤開発 myshoes #CICD2021
CyberAgent における OSS の CI/CD 基盤開発 myshoes #CICD2021whywaita
 
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48Preferred Networks
 
VPCのアウトバウンド通信を制御するためにおさえておきたい設計ポイント
VPCのアウトバウンド通信を制御するためにおさえておきたい設計ポイントVPCのアウトバウンド通信を制御するためにおさえておきたい設計ポイント
VPCのアウトバウンド通信を制御するためにおさえておきたい設計ポイントTakuya Takaseki
 
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...NTT DATA Technology & Innovation
 
PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)
PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)
PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)NTT DATA Technology & Innovation
 
macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~
macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~
macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~NTT Communications Technology Development
 
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理NTT DATA Technology & Innovation
 
さくらのVPS で IPv4 over IPv6ルータの構築
さくらのVPS で IPv4 over IPv6ルータの構築さくらのVPS で IPv4 over IPv6ルータの構築
さくらのVPS で IPv4 over IPv6ルータの構築Tomocha Potter
 

Mais procurados (20)

OpenStackで始めるクラウド環境構築入門
OpenStackで始めるクラウド環境構築入門OpenStackで始めるクラウド環境構築入門
OpenStackで始めるクラウド環境構築入門
 
#logstudy 01 rsyslog入門
#logstudy 01 rsyslog入門#logstudy 01 rsyslog入門
#logstudy 01 rsyslog入門
 
Machine configoperatorのちょっとイイかもしれない話
Machine configoperatorのちょっとイイかもしれない話 Machine configoperatorのちょっとイイかもしれない話
Machine configoperatorのちょっとイイかもしれない話
 
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
 
Pacemakerを使いこなそう
Pacemakerを使いこなそうPacemakerを使いこなそう
Pacemakerを使いこなそう
 
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
 
どうやって決める?kubernetesでのシークレット管理方法(Cloud Native Days 2020 発表資料)
どうやって決める?kubernetesでのシークレット管理方法(Cloud Native Days 2020 発表資料)どうやって決める?kubernetesでのシークレット管理方法(Cloud Native Days 2020 発表資料)
どうやって決める?kubernetesでのシークレット管理方法(Cloud Native Days 2020 発表資料)
 
NGINX Back to Basics: Ingress Controller (Japanese Webinar)
NGINX Back to Basics: Ingress Controller (Japanese Webinar)NGINX Back to Basics: Ingress Controller (Japanese Webinar)
NGINX Back to Basics: Ingress Controller (Japanese Webinar)
 
「Neutronになって理解するOpenStack Network」~Neutron/Open vSwitchなどNeutronと周辺技術の解説~ - ...
「Neutronになって理解するOpenStack Network」~Neutron/Open vSwitchなどNeutronと周辺技術の解説~  - ...「Neutronになって理解するOpenStack Network」~Neutron/Open vSwitchなどNeutronと周辺技術の解説~  - ...
「Neutronになって理解するOpenStack Network」~Neutron/Open vSwitchなどNeutronと周辺技術の解説~ - ...
 
アーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーションアーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーション
 
SR-IOV Networking in OpenStack - OpenStack最新情報セミナー 2016年3月
SR-IOV Networking in OpenStack - OpenStack最新情報セミナー 2016年3月SR-IOV Networking in OpenStack - OpenStack最新情報セミナー 2016年3月
SR-IOV Networking in OpenStack - OpenStack最新情報セミナー 2016年3月
 
CyberAgent における OSS の CI/CD 基盤開発 myshoes #CICD2021
CyberAgent における OSS の CI/CD 基盤開発 myshoes #CICD2021CyberAgent における OSS の CI/CD 基盤開発 myshoes #CICD2021
CyberAgent における OSS の CI/CD 基盤開発 myshoes #CICD2021
 
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
 
VPCのアウトバウンド通信を制御するためにおさえておきたい設計ポイント
VPCのアウトバウンド通信を制御するためにおさえておきたい設計ポイントVPCのアウトバウンド通信を制御するためにおさえておきたい設計ポイント
VPCのアウトバウンド通信を制御するためにおさえておきたい設計ポイント
 
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
 
PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)
PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)
PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)
 
macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~
macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~
macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~
 
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
 
インフラチームのリモートワーク
インフラチームのリモートワークインフラチームのリモートワーク
インフラチームのリモートワーク
 
さくらのVPS で IPv4 over IPv6ルータの構築
さくらのVPS で IPv4 over IPv6ルータの構築さくらのVPS で IPv4 over IPv6ルータの構築
さくらのVPS で IPv4 over IPv6ルータの構築
 

Semelhante a OpenStackアップストリーム活動実践 中級

PTLのお仕事とリリースパイプラインの裏側
PTLのお仕事とリリースパイプラインの裏側PTLのお仕事とリリースパイプラインの裏側
PTLのお仕事とリリースパイプラインの裏側masahito12
 
Interop2014 - OpenStackの概要と最新技術動向(Icehouse)
Interop2014 - OpenStackの概要と最新技術動向(Icehouse)Interop2014 - OpenStackの概要と最新技術動向(Icehouse)
Interop2014 - OpenStackの概要と最新技術動向(Icehouse)irix_jp
 
JTF2014:OpenStackの概要と最新技術動向
JTF2014:OpenStackの概要と最新技術動向JTF2014:OpenStackの概要と最新技術動向
JTF2014:OpenStackの概要と最新技術動向irix_jp
 
Kubernetesの良さを活かして開発・運用!Cloud Native入門 / An introductory Cloud Native #osc19tk
Kubernetesの良さを活かして開発・運用!Cloud Native入門 / An introductory Cloud Native #osc19tkKubernetesの良さを活かして開発・運用!Cloud Native入門 / An introductory Cloud Native #osc19tk
Kubernetesの良さを活かして開発・運用!Cloud Native入門 / An introductory Cloud Native #osc19tkwhywaita
 
OpenStack Summit Sydney Feedback (VTJ玉置) - OpenStack最新情報セミナー 2017年11月
OpenStack Summit Sydney Feedback (VTJ玉置) - OpenStack最新情報セミナー 2017年11月OpenStack Summit Sydney Feedback (VTJ玉置) - OpenStack最新情報セミナー 2017年11月
OpenStack Summit Sydney Feedback (VTJ玉置) - OpenStack最新情報セミナー 2017年11月VirtualTech Japan Inc.
 
入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)
入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)
入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)NTT DATA Technology & Innovation
 
Yahoo!Japan北米DCでOCPのツボをみせてもらってきました - OpenStack最新情報セミナー 2016年5月
Yahoo!Japan北米DCでOCPのツボをみせてもらってきました - OpenStack最新情報セミナー 2016年5月Yahoo!Japan北米DCでOCPのツボをみせてもらってきました - OpenStack最新情報セミナー 2016年5月
Yahoo!Japan北米DCでOCPのツボをみせてもらってきました - OpenStack最新情報セミナー 2016年5月VirtualTech Japan Inc.
 
Open capi meetup20180409 (revised)
Open capi meetup20180409 (revised)Open capi meetup20180409 (revised)
Open capi meetup20180409 (revised)Yutaka Kawai
 
serverless openstack 101
serverless openstack 101serverless openstack 101
serverless openstack 101Naoto Gohko
 
Docker Meetup tpkyo #30 kubecon recap
Docker Meetup tpkyo #30 kubecon recapDocker Meetup tpkyo #30 kubecon recap
Docker Meetup tpkyo #30 kubecon recapYutaro Wada
 
OpenStack Vancouver Summit Report presented at nttgroup meeting in Japanese
OpenStack Vancouver Summit Report presented at nttgroup meeting in JapaneseOpenStack Vancouver Summit Report presented at nttgroup meeting in Japanese
OpenStack Vancouver Summit Report presented at nttgroup meeting in JapaneseToshikazu Ichikawa
 
20190722 OpenStack community past present future
20190722 OpenStack community past present future20190722 OpenStack community past present future
20190722 OpenStack community past present futureAkihiro Motoki
 
OSSのクラウド基盤 OpenStack / CloudStack
OSSのクラウド基盤 OpenStack / CloudStackOSSのクラウド基盤 OpenStack / CloudStack
OSSのクラウド基盤 OpenStack / CloudStackVirtualTech Japan Inc.
 
OpenStack APAC Report
OpenStack APAC ReportOpenStack APAC Report
OpenStack APAC ReportSatoshi Konno
 
[OracleCodeTokyo2019] Kubernetesで実現する運用自動化の新しいアプローチとは
[OracleCodeTokyo2019] Kubernetesで実現する運用自動化の新しいアプローチとは[OracleCodeTokyo2019] Kubernetesで実現する運用自動化の新しいアプローチとは
[OracleCodeTokyo2019] Kubernetesで実現する運用自動化の新しいアプローチとはKoto Shigeru
 

Semelhante a OpenStackアップストリーム活動実践 中級 (20)

PTLのお仕事とリリースパイプラインの裏側
PTLのお仕事とリリースパイプラインの裏側PTLのお仕事とリリースパイプラインの裏側
PTLのお仕事とリリースパイプラインの裏側
 
Interop2014 - OpenStackの概要と最新技術動向(Icehouse)
Interop2014 - OpenStackの概要と最新技術動向(Icehouse)Interop2014 - OpenStackの概要と最新技術動向(Icehouse)
Interop2014 - OpenStackの概要と最新技術動向(Icehouse)
 
JTF2014:OpenStackの概要と最新技術動向
JTF2014:OpenStackの概要と最新技術動向JTF2014:OpenStackの概要と最新技術動向
JTF2014:OpenStackの概要と最新技術動向
 
Hyperledgerプロジェクト概観
Hyperledgerプロジェクト概観Hyperledgerプロジェクト概観
Hyperledgerプロジェクト概観
 
Kubernetesの良さを活かして開発・運用!Cloud Native入門 / An introductory Cloud Native #osc19tk
Kubernetesの良さを活かして開発・運用!Cloud Native入門 / An introductory Cloud Native #osc19tkKubernetesの良さを活かして開発・運用!Cloud Native入門 / An introductory Cloud Native #osc19tk
Kubernetesの良さを活かして開発・運用!Cloud Native入門 / An introductory Cloud Native #osc19tk
 
OpenStack Summit Sydney Feedback (VTJ玉置) - OpenStack最新情報セミナー 2017年11月
OpenStack Summit Sydney Feedback (VTJ玉置) - OpenStack最新情報セミナー 2017年11月OpenStack Summit Sydney Feedback (VTJ玉置) - OpenStack最新情報セミナー 2017年11月
OpenStack Summit Sydney Feedback (VTJ玉置) - OpenStack最新情報セミナー 2017年11月
 
入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)
入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)
入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)
 
Yahoo!Japan北米DCでOCPのツボをみせてもらってきました - OpenStack最新情報セミナー 2016年5月
Yahoo!Japan北米DCでOCPのツボをみせてもらってきました - OpenStack最新情報セミナー 2016年5月Yahoo!Japan北米DCでOCPのツボをみせてもらってきました - OpenStack最新情報セミナー 2016年5月
Yahoo!Japan北米DCでOCPのツボをみせてもらってきました - OpenStack最新情報セミナー 2016年5月
 
OpenStack Octavia入門
OpenStack Octavia入門OpenStack Octavia入門
OpenStack Octavia入門
 
Open capi meetup20180409 (revised)
Open capi meetup20180409 (revised)Open capi meetup20180409 (revised)
Open capi meetup20180409 (revised)
 
serverless openstack 101
serverless openstack 101serverless openstack 101
serverless openstack 101
 
Docker Meetup tpkyo #30 kubecon recap
Docker Meetup tpkyo #30 kubecon recapDocker Meetup tpkyo #30 kubecon recap
Docker Meetup tpkyo #30 kubecon recap
 
Tekton 入門
Tekton 入門Tekton 入門
Tekton 入門
 
OpenStack Vancouver Summit Report presented at nttgroup meeting in Japanese
OpenStack Vancouver Summit Report presented at nttgroup meeting in JapaneseOpenStack Vancouver Summit Report presented at nttgroup meeting in Japanese
OpenStack Vancouver Summit Report presented at nttgroup meeting in Japanese
 
20190722 OpenStack community past present future
20190722 OpenStack community past present future20190722 OpenStack community past present future
20190722 OpenStack community past present future
 
OSSのクラウド基盤 OpenStack / CloudStack
OSSのクラウド基盤 OpenStack / CloudStackOSSのクラウド基盤 OpenStack / CloudStack
OSSのクラウド基盤 OpenStack / CloudStack
 
2018 07-19dist
2018 07-19dist2018 07-19dist
2018 07-19dist
 
OpenStack Summit Vancouver YVR Ops
OpenStack Summit Vancouver YVR OpsOpenStack Summit Vancouver YVR Ops
OpenStack Summit Vancouver YVR Ops
 
OpenStack APAC Report
OpenStack APAC ReportOpenStack APAC Report
OpenStack APAC Report
 
[OracleCodeTokyo2019] Kubernetesで実現する運用自動化の新しいアプローチとは
[OracleCodeTokyo2019] Kubernetesで実現する運用自動化の新しいアプローチとは[OracleCodeTokyo2019] Kubernetesで実現する運用自動化の新しいアプローチとは
[OracleCodeTokyo2019] Kubernetesで実現する運用自動化の新しいアプローチとは
 

Mais de Takashi Natsume

KubeCon + CloudNativeCon Europe 2019 参加報告
KubeCon + CloudNativeCon Europe 2019 参加報告KubeCon + CloudNativeCon Europe 2019 参加報告
KubeCon + CloudNativeCon Europe 2019 参加報告Takashi Natsume
 
国際委員会 総括・広報の取り組み
国際委員会 総括・広報の取り組み国際委員会 総括・広報の取り組み
国際委員会 総括・広報の取り組みTakashi Natsume
 
赤門技術士会設立について
赤門技術士会設立について赤門技術士会設立について
赤門技術士会設立についてTakashi Natsume
 
日本OpenStackユーザ会第40回勉強会 Nova最新動向
日本OpenStackユーザ会第40回勉強会 Nova最新動向日本OpenStackユーザ会第40回勉強会 Nova最新動向
日本OpenStackユーザ会第40回勉強会 Nova最新動向Takashi Natsume
 
OpenStack Summit Vancouver 2018 Nova最新動向
OpenStack Summit Vancouver 2018 Nova最新動向OpenStack Summit Vancouver 2018 Nova最新動向
OpenStack Summit Vancouver 2018 Nova最新動向Takashi Natsume
 
オープンソースソフトウェア開発におけるバグ修正活動の課題分析とその解決方法の提案
オープンソースソフトウェア開発におけるバグ修正活動の課題分析とその解決方法の提案オープンソースソフトウェア開発におけるバグ修正活動の課題分析とその解決方法の提案
オープンソースソフトウェア開発におけるバグ修正活動の課題分析とその解決方法の提案Takashi Natsume
 
オープンソースソフトウェア開発におけるコミュニティ活動の課題分析とその解決方法の提案
オープンソースソフトウェア開発におけるコミュニティ活動の課題分析とその解決方法の提案オープンソースソフトウェア開発におけるコミュニティ活動の課題分析とその解決方法の提案
オープンソースソフトウェア開発におけるコミュニティ活動の課題分析とその解決方法の提案Takashi Natsume
 
情報システムの性能マネジメントについて
情報システムの性能マネジメントについて情報システムの性能マネジメントについて
情報システムの性能マネジメントについてTakashi Natsume
 

Mais de Takashi Natsume (8)

KubeCon + CloudNativeCon Europe 2019 参加報告
KubeCon + CloudNativeCon Europe 2019 参加報告KubeCon + CloudNativeCon Europe 2019 参加報告
KubeCon + CloudNativeCon Europe 2019 参加報告
 
国際委員会 総括・広報の取り組み
国際委員会 総括・広報の取り組み国際委員会 総括・広報の取り組み
国際委員会 総括・広報の取り組み
 
赤門技術士会設立について
赤門技術士会設立について赤門技術士会設立について
赤門技術士会設立について
 
日本OpenStackユーザ会第40回勉強会 Nova最新動向
日本OpenStackユーザ会第40回勉強会 Nova最新動向日本OpenStackユーザ会第40回勉強会 Nova最新動向
日本OpenStackユーザ会第40回勉強会 Nova最新動向
 
OpenStack Summit Vancouver 2018 Nova最新動向
OpenStack Summit Vancouver 2018 Nova最新動向OpenStack Summit Vancouver 2018 Nova最新動向
OpenStack Summit Vancouver 2018 Nova最新動向
 
オープンソースソフトウェア開発におけるバグ修正活動の課題分析とその解決方法の提案
オープンソースソフトウェア開発におけるバグ修正活動の課題分析とその解決方法の提案オープンソースソフトウェア開発におけるバグ修正活動の課題分析とその解決方法の提案
オープンソースソフトウェア開発におけるバグ修正活動の課題分析とその解決方法の提案
 
オープンソースソフトウェア開発におけるコミュニティ活動の課題分析とその解決方法の提案
オープンソースソフトウェア開発におけるコミュニティ活動の課題分析とその解決方法の提案オープンソースソフトウェア開発におけるコミュニティ活動の課題分析とその解決方法の提案
オープンソースソフトウェア開発におけるコミュニティ活動の課題分析とその解決方法の提案
 
情報システムの性能マネジメントについて
情報システムの性能マネジメントについて情報システムの性能マネジメントについて
情報システムの性能マネジメントについて
 

OpenStackアップストリーム活動実践 中級

  • 1. Copyright©2019 NTT corp. All Rights Reserved. OpenStackアップストリーム活動実践 中級 2019年7月22日(月) 夏目貴史(Takashi Natsume) NTT ソフトウェアイノベーションセンタ takashi.natsume.hz@hco.ntt.co.jp (旧メールアドレス: natsume.takashi@lab.ntt.co.jp) IRC: takashin CloudNative Days Tokyo 2019 / OpenStack Days Tokyo 2019 1F3
  • 2. 2Copyright©2019 NTT corp. All Rights Reserved. • 名前 夏目 貴史(なつめ たかし) • 所属 • 日本電信電話株式会社ソフトウェアイノベーションセンタ • 業務 • OpenStackコミュニティ活動(Upstream) • 主にNovaプロジェクトおよびその関連プロジェクトで活動 • python-novaclientのCore reviewer • 最近はコンテナ型仮想化関連も • Kubernetes、他。 • Observability(可観測性)について調査・検証等を行なっています。 • ブログ • https://medium.com/@natsume.takashi 自己紹介
  • 3. 3Copyright©2019 NTT corp. All Rights Reserved. 1. Novaのプロセス構成 2. 開発フロー 3. REST API 4. CLI 5. ドキュメント 6. テスト(Testing) 7. データベース 8. Versioned Notification 9. セキュリティ 10.Upgrade 11.ConfigオプションとPolicy 12.Backport 13.Pythonパッケージとライブラリ 14.他のプロジェクトとの連携 15.TIPS アジェンダ
  • 4. 4Copyright©2019 NTT corp. All Rights Reserved. • 講演の目的 • OpenStackコミュニティに開発者としてより貢献するのに必要な 知識について説明する • 膨大なドキュメントがある中で、開発者としてより貢献するのに 必要なドキュメントを紹介する • ドキュメントに書かれていない、ドキュメントどおりには行かな い事項について説明する。 • 注意事項 • Novaを中心に話しますが、他のプロジェクト(コンポーネント) では異なる場合があります。 • Novaのソースコードを元に説明する箇所がありますが、以下のバ ージョンを使用しています。 • masterブランチ (commit ed49947d5acdc6435e0a76a20b8341228fbe8d27 ) • ドキュメントについては2019年7月16日に参照した内容をベース に説明します。 はじめに
  • 5. 5Copyright©2019 NTT corp. All Rights Reserved. Novaのプロセス構成
  • 6. 6Copyright©2019 NTT corp. All Rights Reserved. Novaを構成するプロセス 図の出典: https://docs.openstack.org/nova/latest/user/cellsv2-layout.html#multiple-cells 複数セル構成時のnovaのプロセス構成 (デフォルトはCell1のみ(Cell0を除く)の単一セル構成)
  • 7. 7Copyright©2019 NTT corp. All Rights Reserved. • Filter schedulerの仕組みがあるが、Placementを利用 する方向で修正が進んでいる • Filter schedulerの利用は縮小しており、いくつかの Scheduling Filterが非推奨(Deprecated)になった • Placementを呼び出す前にRequest Filterという仕組み で、Request Specに条件を追加している(そのRequest Specをもとに作成したResource Requestを使って Placementに仮想サーバの配置先の候補を問い合わせる) • nova/scheduler/request_filter.py • 他にFlavorやImageのPropertyに設定されたtraitは Resource Requestを作成する以下のメソッドで抽出さ れる • resources_from_request_spec(nova/scheduler/utils.py) Scheduler
  • 8. 8Copyright©2019 NTT corp. All Rights Reserved. • Placementの呼び出しは以下のクライアントクラスで 実装されている • nova.scheduler.client.report.SchedulerReportClient • Placementについても理解する必要がある • https://docs.openstack.org/placement/latest/ Scheduler (続き)
  • 9. 9Copyright©2019 NTT corp. All Rights Reserved. 開発フロー
  • 10. 10Copyright©2019 NTT corp. All Rights Reserved. Novaの開発フロー 図の出典: Nova team process (URLは次ページ) 1. REST API (Compute API)の変更はspecの作成・提出および 承認が必要 2. 機能の追加(削除)はblueprint、Bug修正はBug report 3. 機能の追加はBlueprintとspecの作成・提出および承認が 必要であるが、設計上の議論がない場合(例えば非推奨となった 機能を削除する等)はspecの提出・承認は必要ない (不要なことはIRC Meeting等で確認する必要がある)。※ ※ https://docs.openstack.org/nova/latest/contributor/blueprints.html#specs 図は次ページに続く
  • 11. 11Copyright©2019 NTT corp. All Rights Reserved. Novaの開発フロー 図の出典: Nova team process https://docs.openstack.org/nova/latest/contributor/process.html
  • 12. 12Copyright©2019 NTT corp. All Rights Reserved. • 独立したリポジトリとなっている (openstack/nova-specs) • reStructuredTextで記述する(Sphinxでビルドする) • リリースごとのテンプレートが存在するので、基本的にはそのテ ンプレートに従い必要事項を記載してGerritでレビュー・承認し てもらう • Trainリリース向けspecのテンプレート • https://specs.openstack.org/openstack/nova- specs/specs/train/template.html • 「specs/リリース名/approved」のディレクトリに置く • 特に注意すべきは「Upgrade Impact」である • NリリースとN+1リリースの共存はサポートする(ローリング・アップグ レード可能にする) • 過去のリリース向けに承認されたspecを再提出する場合は「 Previously-approved: リリース名」のタグをコミット・メッ セージに入れる • https://specs.openstack.org/openstack/nova- specs/readme.html#previously-approved-specifications • Compute APIの追加・変更を行なう場合は「APIImpact」の タグをコミット・メッセージに入れる Nova spec
  • 13. 13Copyright©2019 NTT corp. All Rights Reserved. Specの例 https://specs.openstack.org/openstack/nova-specs/specs/queens/implemented/cold-migration-with-target-queens.html
  • 14. 14Copyright©2019 NTT corp. All Rights Reserved. • 以下を参照(Trainリリースの場合) • https://releases.openstack.org/train/schedule.html • Novaにおいては最近の傾向として • milestone-2(train-2)がspecフリーズ(specの承認期限) • milestone-3(train-3)がfeatureフリーズ(機能追加のパッチ のマージ期限) • それ以降は基本的にBug Fixのみ • クライアント・ライブラリ(python-novaclient)に ついては、milestone-3でリリースを行なう リリース・スケジュール
  • 15. 15Copyright©2019 NTT corp. All Rights Reserved. • Technical Committeeにより各リリースごとに設定 されるOpenStackの全体で取り組む作業項目 • 例: Python 3.5のサポート (Pike) • TC Goalsと呼ばれることも • 各プロジェクトにおいて強制力はない(努力目標のよう なもの) • https://governance.openstack.org/tc/goals/ index.html 【参考】OpenStack-wide Goals
  • 16. 16Copyright©2019 NTT corp. All Rights Reserved. • Chronological PTL guide • https://docs.openstack.org/nova/latest/contributor/ptl -guide.html • 時系列でPTLがやるべき作業が記載されている • Novaプロジェクトの前PTLのMelanie Wittさん作成 【参考】PTLガイド
  • 17. 17Copyright©2019 NTT corp. All Rights Reserved. REST API
  • 18. 18Copyright©2019 NTT corp. All Rights Reserved. • REST API (Compute API)を追加・変更する場合(内部の処理 ではなくインタフェース自体の追加・変更)は、まずspecを提案 する • 追加方法(手順) 1. URLマッピングの追加(必要なら) • nova/api/openstack/compute/routes.py 2. ポリシーの定義(必要なら) • nova/policies以下(後述) 3. スキーマ・チェック(JSONリクエスト・ボディ、Queryパラメータ)の 追加・修正 • nova/api/openstack/compute/schemas以下 4. Controllerの追加または修正 • nova/api/openstack/compute以下 5. ユニット・テストの追加 6. Functionalテスト(APIのJSONリクエスト・ボディ、レスポンス・ボデ ィのサンプルのためのテスト)の追加 7. ドキュメントの修正(後述) API Reference、API Guide等 https://docs.openstack.org/nova/latest/contributor/api.html REST APIの追加・変更
  • 19. 19Copyright©2019 NTT corp. All Rights Reserved. • 後方互換性(Backward compatibility)を維持するた め、マイクロバージョンの仕組みを採用している。 • https://docs.openstack.org/nova/latest/contributor/mi croversions.html • どのような場合にAPIマイクロバージョンを追加する( Bump、上げる)必要があるかは次ページを参照 API マイクロバージョン
  • 20. 20Copyright©2019 NTT corp. All Rights Reserved. 新しいAPIマイクロバージョンの必要性の判断 図の出典: https://docs.openstack.org/nova/latest/contributor/microversions.html#when-do-i-need-a-new-microversion
  • 21. 21Copyright©2019 NTT corp. All Rights Reserved. 新しいAPIマイクロバージョンの必要性の判断(続き) 以下のリストも参照 https://docs.openstack.org/nova/latest/contributor/microversions.html#when-do-i- need-a-new-microversion レスポンスにおいて以下の場合(フローチャートの記載から漏れている条件) 1. the allowed values of non free form fields Example: adding a new allowed status to servers/{ID} 2. new headers returned on a response
  • 22. 22Copyright©2019 NTT corp. All Rights Reserved. • 基本的に前述したフローチャートおよびリストを基に判 断すれば良いが、議論になるケースもある • 例:レスポンスのBodyで文字列として定義されているが、列挙 型(Enum)ではなく、単に文字列と定義されており、返却さ れる値の種類が増えるケース • 追加し(バージョンを上げ)ないこともできるが、追加 可能である • 新しいAPIマイクロバージョンを追加することにより、 その機能が使用できることをユーザが認識できる 新しいAPIマイクロバージョンの追加
  • 23. 23Copyright©2019 NTT corp. All Rights Reserved. • OpenStack API Special Interest Group • http://specs.openstack.org/openstack/api- wg/index.html • HTTP Response Codes • REST APIのレスポンスとしてどのHTTPステータスコードを返 すべきか • http://specs.openstack.org/openstack/api- wg/guidelines/http/response-codes.html REST API 追加・変更の参考情報
  • 24. 24Copyright©2019 NTT corp. All Rights Reserved. REST API修正(マイクロバージョン追加)の例 https://review.opendev.org/#/c/408964/ Controllerの修正 最新マイクロバージョンの更新と追加したマイクロバージョンの説明の追加 スキーマ・チェックの追加 API Referenceの修正 APIサンプルテストの追加 APIサンプルテストの追加
  • 25. 25Copyright©2019 NTT corp. All Rights Reserved. CLI
  • 26. 26Copyright©2019 NTT corp. All Rights Reserved. • APIマイクロバージョンを追加した場合、クライアント (CLIとPython API bindings)の修正も必要になる • python-novaclient (novaコマンド) • python-openstackclient (openstackコマンド) • Code Review Guide for Novaより • A new patch for the microversion API change in python- novaclient side should be submitted before the microversion change in Nova is merged. https://docs.openstack.org/nova/latest/contributor/code- review.html#microversion-api • python-novaclientからpython-openstackclientへの移行が コミュニティの基本的な方針が、現在もpython-novaclientへ の実装は必須である CLIの追加・修正
  • 27. 27Copyright©2019 NTT corp. All Rights Reserved. • 追加方法のドキュメント • Adding support for a new microversion https://docs.openstack.org/python- novaclient/latest/contributor/microversions.html • 手順 1. サポートするAPIマイクロバージョンの定義の修正 2. CLIとPython APIの修正 3. 対応するテストの追加 4. CLIリファレンスの修正 5. Release noteの追加 python-novaclientへのAPIマイクロバージョン対応の追加
  • 28. 28Copyright©2019 NTT corp. All Rights Reserved. python-novaclientへのAPIマイクロバージョン対応の追加 (続き)
  • 29. 29Copyright©2019 NTT corp. All Rights Reserved. • 管理者が使うツール • Placement、Cells V2、データベース関連の操作を行なう https://docs.openstack.org/nova/latest/cli/nova- manage.html • 追加・変更する場合はnova/cmd/manage.pyを修正する • ドキュメントの更新も忘れずに • doc/source/cli/nova-manage.rst nova-manageコマンド
  • 30. 30Copyright©2019 NTT corp. All Rights Reserved. • nova-status upgrade check • Upgradeの準備が完了しているかどうかのチェックを行なうコ マンド • 前提となるCinderのバージョン • データベースのレコードの整合性 • データベースのレコードの移行が完了しているか • ローリング・アップグレードのために必要な設定がされているか 他 • 必要であればnova/cmd/status.pyを修正してチェックを追加 する • 参考 • ローリング・アップグレードの手順 • https://docs.openstack.org/nova/latest/user/upgrade.htm l#rolling-upgrade-process nova-statusコマンド
  • 31. 31Copyright©2019 NTT corp. All Rights Reserved. ドキュメント
  • 32. 32Copyright©2019 NTT corp. All Rights Reserved. • Nova doc • End User、Operator、Contributor(Developer)向けのドキュ メント • doc/source以下 • 修正や追加に関連するドキュメントは更新する必要がある • サポート・マトリックスも • 新機能追加時は使用方法を追加することも • API Reference • APIマイクロバージョンの追加を行なったときは更新する • API reference guideline • https://docs.openstack.org/nova/latest/contributor/api-ref- guideline.html • API Guide • Compute API、Novaを構成する要素の概説、用語解説等のドキ ュメント • api-guide/source以下 • 修正や追加に関連するドキュメントは更新する必要がある • Release note(後述) ドキュメント その1
  • 33. 33Copyright©2019 NTT corp. All Rights Reserved. • リダイレクト • ページを移動した(パスを変更した)場合に、外部ドキュメン トからリンクしている箇所がリンク切れになってしまう • 移動後のページにリダイレクトさせる • doc /source/_extra/.htaccessに対象パスとHTTPステータスコ ード301を返すことと転送先のパスを定義する • doc /test/redirect-tests.txtに転送の実施の確認用のテストのた めの行を追加する • 参考 • https://review.opendev.org/#/c /640730/ • ディレクティブ • 以下のディレクティブを適切に使用する。 • .. todo:: • .. important:: • .. note:: • .. code-block:: • 他 ドキュメント その2 ※ https://docs.openstack.org/nova/latest/contributor/blueprints.htmlからの抜粋
  • 34. 34Copyright©2019 NTT corp. All Rights Reserved. • 他のプロジェクトのドキュメントの参照 • doc/source/conf.pyのopenstack_projectsに追加する • stableブランチを持つプロジェクトの ドキュメントへの参照を適切に変換してくれる。 (master→master、stable→stable) • ファイルの中では以下のように指定する(Placementの例) • 例 :placement-doc:`Placement <install/>` ドキュメント その3 (前略) openstack_projects = [ 'ceilometer', 'cinder', 'glance', 'horizon', 'ironic', 'keystone', 'neutron', 'nova', 'oslo.log', 'oslo.messaging', 'oslo.i18n', 'oslo.versionedobjects', 'placement', 'python-novaclient', 'python-openstackclient', 'watcher’, ] (後略)
  • 35. 35Copyright©2019 NTT corp. All Rights Reserved. • Renoというツールを使用する • https://docs.openstack.org/reno/latest/ • 使用方法 • https://docs.openstack.org/reno/latest/user/usage.html • 生成されたファイルをgit addして、ファイルを編集して、必要なセクシ ョンを残して必要な記述を行なう • 追加すべき場合 • ユーザおよび運用者への影響がある事項 • Compute APIの追加・変更(APIマイクロバージョンの追加) • CLIの変更(nova-manage、nova-status、novaコマンド等) • コンピュート・ドライバそのものの追加、既存のものへの機能追加・変更 • セキュリティに関する修正 • アップグレードに伴う変更(configオプションの削除・移行、運用者の対応が 必要なデータベースのスキーマ変更等) 他 • https://docs.openstack.org/nova/latest/contributor/releasenote s.html#when-a-release-note-is-needed • 過去のRelease noteも参考にできる • https://docs.openstack.org/releasenotes/nova/ • https://releases.openstack.org/ Release note
  • 36. 36Copyright©2019 NTT corp. All Rights Reserved. • OpenStack Documentation • https://docs.openstack.org/ • 上記のURL以下にあるページから各プロジェクトのイン ストールガイド、ユーザガイド等をリンクするための設定 やリダイレクトの有効化を行なう • openstack/openstack-manualsプロジェクト • www/project-data/latest.yamlで設定 (latest(master)だけでなく、各リリースごとにyamlファイルがある) • https://docs.openstack.org/doc-contrib-guide/doc-tools/template- generator.html#project-data-file-format OpenStack Manuals (前略) - name: nova service: Compute service service_type: compute has_api_ref: true has_api_guide: true has_install_guide: true has_config_ref: true has_admin_guide: true has_user_guide: true has_in_tree_htaccess: true type: service (後略) openstack/openstack-manuals master commit 85aed22318d1a9facd4f74133dc115060c856ae6
  • 37. 37Copyright©2019 NTT corp. All Rights Reserved. テスト (Testing)
  • 38. 38Copyright©2019 NTT corp. All Rights Reserved. • assert文の注意点 • mockのassert文のtypoのためにチェックが正常に行われない ケースがあるため要注意 • asset_called_once_with • assertTrue(True, ... • assertIsNone(None, ... • assertEqualとすべきところをassertTrueとしている • assertTrue(2, len(test_list)) Unit Test その1
  • 39. 39Copyright©2019 NTT corp. All Rights Reserved. • mockの使用 • メソッドのデコレータでmockするメソッド等を定義する • @mock.patch(... • @mock.patch.object(... • テスト対象のメソッドを実行する前にmockを適用したくない 場合の対処法 • mockするメソッド等が1つの場合 • with mock.patch(... または with mock.patch.object(... • mockするメソッド等が複数の場合 • with test.nestedの利用(nova.test.nested) • Inner functionの利用 • 変数(定数)へのmockの適用 • 引数のnewを利用する。 • Propertyへのmockの適用 • 引数 new_callable=mock.PropertyMockを利用する Unit Test その2 (前略) @mock.patch('nova.db.api.service_get_minimum_version', return_value={'nova-compute': 2}) def test_create_below_minimum(self, mock_get): with mock.patch('nova.objects.service.SERVICE_VERSION', new=1): self.assertRaises(exception.ServiceTooOld, objects.Service(context=self.context, binary='nova-compute', ).create) (後略) nova/tests/unit/objects/test_service.py
  • 40. 40Copyright©2019 NTT corp. All Rights Reserved. Unit Test その3 (前略) def test_start(self): params = dict(vm_state=vm_states.STOPPED) instance = self._create_instance_obj(params=params) rpcapi = self.compute_api.compute_rpcapi with test.nested( mock.patch.object(instance, 'save'), mock.patch.object(self.compute_api, '_record_action_start'), mock.patch.object(rpcapi, 'start_instance') ) as (mock_inst_save, mock_record_action, mock_start_instance): self.compute_api.start(self.context, instance) self.assertEqual(task_states.POWERING_ON, instance.task_state) mock_inst_save.assert_called_once_with(expected_task_state=[None]) mock_record_action.assert_called_once_with( self.context, instance, instance_actions.START) mock_start_instance.assert_called_once_with(self.context, instance) (後略) (前略) def test_instance_set_to_error_on_uncaught_exception(self): # Test that instance is set to error state when exception is raised. instance = self._create_fake_instance_obj() fake_network.unset_stub_network_methods(self) @mock.patch.object(self.compute.network_api, 'allocate_for_instance', side_effect=messaging.RemoteError()) @mock.patch.object(self.compute.network_api, 'deallocate_for_instance') def _do_test(mock_deallocate, mock_allocate): self.compute.build_and_run_instance(self.context, instance, {}, {}, {}, block_device_mapping=[]) instance.refresh() self.assertEqual(vm_states.ERROR, instance.vm_state) self.compute.terminate_instance(self.context, instance, []) _do_test() (後略) with test.nestedの例 nova/tests/unit/compute/test_compute_api.py Inner functionの例 nova/tests/unit/compute/test_compute.py
  • 41. 41Copyright©2019 NTT corp. All Rights Reserved. • メソッドの引数の確認 • assert_called_once_with等でメソッドの引数をチェックでき る • ただし、あるクラスのインスタンスで、クラスは同じでも違う インスタンスだとチェックが失敗することがある • 例えば、nova.context.RequestContext • その時はnova.test.MatchTypeを使用する • mock.ANYも使用できるが個人的にお勧めしない Unit Test その4 (前略) from nova import test (中略) @mock.patch.object(fake.FakeDriver, 'spawn') def test_on_shared_storage_not_provided_host_with_shared_storage(self, mock_spawn): self.stub_out('nova.virt.fake.FakeDriver.instance_on_disk', lambda *a, **ka: True) self._rebuild(on_shared_storage=None) mock_spawn.assert_called_once_with( test.MatchType(context.RequestContext), test.MatchType(objects.Instance), test.MatchType(objects.ImageMeta), mock.ANY, 'newpass', mock.ANY, network_info=mock.ANY, block_device_info=mock.ANY) (後略) nova/tests/unit/compute/test_compute.py
  • 42. 42Copyright©2019 NTT corp. All Rights Reserved. • コードの記述方法(スタイル)のガイドラインが存在す る • https://docs.openstack.org/hacking/latest/user/hackin g.html • 静的解析ルールによるチェック(後述)があるが、チェ ックしていないものもある • 例: importの順序 OpenStack Style Guideline
  • 43. 43Copyright©2019 NTT corp. All Rights Reserved. • Hacking checkの追加 • pep8(flake8)での静的チェック • 過去にあった同じ間違いを繰り返さないためにチェックを追加 することが推奨される • 主に正規表現でチェックを行なうが、正規表現が難しいケース も存在する。 • 正規表現は可読性を考えることも重要 • ローカルではなく「OpenStack Hacking Style Checks」に 追加することも検討する • https://opendev.org/openstack/hacking 静的解析ルール(Hacking Check)の追加
  • 44. 44Copyright©2019 NTT corp. All Rights Reserved. • ルールのドキュメントへの追加 • HACKING.rst 静的解析ルール(Hacking Check)の追加方法 - [N361] Check for usage of deprecated assertRegexpMatches and assertNotRegexpMatches 次ページへ続く
  • 45. 45Copyright©2019 NTT corp. All Rights Reserved. • チェック用メソッドの追加と登録 • nova/hacking/checks.py • 解析ルールのためのユニット・テストの追加 • nova/tests/unit/test_hacking.py 静的解析ルール(Hacking Check)の追加方法 (続き) (前略) asse_regexpmatches = re.compile( r"(assertRegexpMatches|assertNotRegexpMatches)¥(") (中略) def assert_regexpmatches(logical_line): """Check for usage of deprecated assertRegexpMatches/assertNotRegexpMatches N361 """ res = asse_regexpmatches.search(logical_line) if res: yield (0, "N361: assertRegex/assertNotRegex must be used instead " "of assertRegexpMatches/assertNotRegexpMatches.") (中略) def factory(register): (中略) register(assert_regexpmatches) (後略) ※ https://review.opendev.org/#/c/613184/
  • 46. 46Copyright©2019 NTT corp. All Rights Reserved. • ユニット・テストのカバレッジをで以下で取得できる • tox –e cover • 分岐網羅 (C1) テストのカバレッジ
  • 47. 47Copyright©2019 NTT corp. All Rights Reserved. • Functional Testとは • https://docs.openstack.org/nova/latest/contributor/testin g.html#functional-tests • Unit testやtempestによるOpenStackのコンポーネントが全て デプロイされた環境へのテストでカバーされない範囲を対象とす る • Novaのコードに閉じたテストで、外部コンポーネント(Cinder 、Neutron、Placement等)へのアクセスはスタブを使用して、 novaプロセス間の連携を含めてテストする。 • どのような場合に追加すべきなのか • はっきりとした基準があるわけではない。 • 必ず追加するケース • APIマイクロバージョンの追加(APIサンプルの追加) • Versioned Notificationの追加(Notificationサンプルの追加) • 必要に応じて追加するケース(だいたい以下のようなケース) • 複数セルをまたがった処理の追加・修正 • APIデータベースのスキーマ変更 • リグレッションテスト 他 Functional Test
  • 48. 48Copyright©2019 NTT corp. All Rights Reserved. • Fixtures • 外部コンポーネント(Cinder、Neutron、Placement他)のスタブ • ファイル • nova/tests/fixtures.py • nova/tests/functional/fixtures.py • CinderのFixtureの追加例 • https://review.opendev.org/#/c /250283/ Functional Test (続き)
  • 49. 49Copyright©2019 NTT corp. All Rights Reserved. • Tempest • The OpenStack Integration Test Suite • https://docs.openstack.org/tempest/latest/ • Compute APIのレスポンス・スキーマを変更した場 合にはTempestにテストを追加しなければならない • https://docs.openstack.org/nova/latest/contributor/co de-review.html#microversion-api • 追加したパッチの例 • https://review.opendev.org/#/c /467897/ Tempest
  • 50. 50Copyright©2019 NTT corp. All Rights Reserved. • プロジェクトごとに.zuul.yamlファイルで定義されて いる • ただし、ベースとなるJobはopenstack/openstack-zuul-jobs プロジェクトやopenstack/project-configプロジェクトで定 義されている • 例外 • masterブランチでしか実行しないJob等は openstack/project-configプロジェクトに定義する(定義さ れている) • Central Config Exceptions https://docs.openstack.org/infra/manual/creators.html#central-config- exceptions ジョブ(check, gate) (前略) - project: name: openstack/nova templates: - periodic-jobs-with-oslo-master - publish-to-pypi - translation-jobs-master-stable - api-guide-jobs - api-ref-jobs (後略) openstack/project-configプロジェクト zuul.d/projects.yaml commit 69b6379e677a3e11dadbff1795c3796f015f4395
  • 51. 51Copyright©2019 NTT corp. All Rights Reserved. • Gerritのリンクを辿ると生成されたドキュメントが参 照できるので、そこからチェックできる。 ジョブの結果の見方 API guideのcheck jobは build-openstack-api-guideである
  • 52. 52Copyright©2019 NTT corp. All Rights Reserved. データベース
  • 53. 53Copyright©2019 NTT corp. All Rights Reserved. • データベースは2種類ある(Nova) • APIデータベース • セル・データベース • データベース関連ソースコード • nova/db以下に存在する • セル・データベースを参照・更新する操作の追加 • nova/db/api.pyにインタフェース(内部で処理を行なうメソッド を呼び出すだけのメソッド)を定義する • nova/db/sqlalchemy/api.pyに処理を行なうメソッドを追加する • sqlalchemyを使用したSQL操作は他のメソッドを参考に実装できる • APIデータベースの操作は主にnova/object以下にある各 オブジェクトの中に記述されている データベース その1
  • 54. 54Copyright©2019 NTT corp. All Rights Reserved. • アップグレードに伴うスキーマの変更 • 削除(drop)や変更(alter)の操作(subtractive DB migrations)は基本的に禁止されている(例外あり) • ユニット・テストでもチェックするようになっている • https://review.opendev.org/#/c /197349/ • スキーマ変更の実装 • 以下のディレクトリに「数値3桁_名前.py」(例: 373_migration_uuid.py)のファイルを作成して、その中に upgradeメソッドを実装する。「数値3桁」はそのディレクトリに あるファイルに付いている数値のうち一番大きな数字に1を足した ものとする(393が最大なら、394を使用する) • セル・データベース • nova/db/sqlalchemy/migrate_repo /versions • APIデータベース • nova/db/sqlalchemy/api_migrations /migrate_repo /versions • テストも実装する • nova/tests/unit/db/test_migrations.py • nova/tests/functional/db/api/test_migrations.py データベース その2
  • 55. 55Copyright©2019 NTT corp. All Rights Reserved. • アップグレードにともなうDBレコードの変換や補完、整合 性の確保の処理が必要なら、以下に処理を追加する • オブジェクト • オブジェクトにおいてDBテーブルから読み込む時は新旧両方に対応す るとともに、DBテーブルへの保管を行なうときは新しい形式とする • 変換・補完用コマンド(アップグレード時に実行) • nova-manage db online_data_migrations • nova/cmd/manage.pyのDbCommandsクラスのonline_migrationsに追加 https://docs.openstack.org/nova/latest/contributor/code- review.html#database-schema • アップグレード時に以下のコマンドでデータベースのスキー マを変更する • nova-manage db sync (セル・データベース) • nova-manage api_db sync (APIデータベース) • online_data_migrationsを含めた手順の詳細は以下を参照 • https://docs.openstack.org/nova/latest/user/upgrade.html#r olling-upgrade-process データベース その3
  • 56. 56Copyright©2019 NTT corp. All Rights Reserved. Versioned Notification
  • 57. 57Copyright©2019 NTT corp. All Rights Reserved. • Versioned Notificationとは • Payloadの要素の追加/削除/変更に合わせてPayloadをバー ジョン付けした通知の機能 • Legacy notificationからの変換がSteinリリースで完了した。 • Notifications in Nova • https://docs.openstack.org/nova/latest/reference/notifica tions.html • Nova versioned notifications - the result of a 3 year journey • https://www.openstack.org/videos/summits/denver- 2019/nova-versioned-notifications-the-result-of-a-3-year- journey Versioned Notificationの追加 その1
  • 58. 58Copyright©2019 NTT corp. All Rights Reserved. • 新規追加方針 • どのタイミングでどういったNotificationを出すといった決ま りはない(以前ライブ・マイグレーションのNotificationの変 換の時に課題として認識されたがそのまま) • 非同期の操作(HTTPステータスコード 202 Acceptedが返さ れる操作)およびDBのレコードの変更を伴うような同期的な操 作の開始/終了(完了)時において通知が発行されるようにな っている Versioned Notificationの追加 その2
  • 59. 59Copyright©2019 NTT corp. All Rights Reserved. 1. Notification Payloadクラスの追加 nova/notifications/objects以下に追加する Versioned Notificationの追加方法 その1 (前略) @nova_base.NovaObjectRegistry.register_notification class VolumeUsagePayload(base.NotificationPayloadBase): # Version 1.0: Initial version VERSION = '1.0' SCHEMA = { 'volume_id': ('vol_usage', 'volume_id'), 'project_id': ('vol_usage', 'project_id'), 'user_id': ('vol_usage', 'user_id'), 'availability_zone': ('vol_usage', 'availability_zone'), 'instance_uuid': ('vol_usage', 'instance_uuid'), 'last_refreshed': ('vol_usage', 'last_refreshed'), 'reads': ('vol_usage', 'reads'), 'read_bytes': ('vol_usage', 'read_bytes'), 'writes': ('vol_usage', 'writes'), 'write_bytes': ('vol_usage', 'write_bytes') } fields = { 'volume_id': fields.UUIDField(), 'project_id': fields.StringField(nullable=True), 'user_id': fields.StringField(nullable=True), 'availability_zone': fields.StringField(nullable=True), 'instance_uuid': fields.UUIDField(nullable=True), 'last_refreshed': fields.DateTimeField(nullable=True), 'reads': fields.IntegerField(), 'read_bytes': fields.IntegerField(), 'writes': fields.IntegerField(), 'write_bytes': fields.IntegerField() } def __init__(self, vol_usage): super(VolumeUsagePayload, self).__init__() self.populate_schema(vol_usage=vol_usage) (後略) (前略) @base.NovaObjectRegistry.register class VolumeUsage(base.NovaPersistentObject, base.NovaObject): # Version 1.0: Initial version VERSION = '1.0' fields = { 'id': fields.IntegerField(read_only=True), 'volume_id': fields.UUIDField(), 'instance_uuid': fields.UUIDField(nullable=True), 'project_id': fields.StringField(nullable=True), 'user_id': fields.StringField(nullable=True), 'availability_zone': fields.StringField(nullable=True), 'tot_last_refreshed': fields.DateTimeField(nullable=True, read_only=True), 'tot_reads': fields.IntegerField(read_only=True), 'tot_read_bytes': fields.IntegerField(read_only=True), 'tot_writes': fields.IntegerField(read_only=True), 'tot_write_bytes': fields.IntegerField(read_only=True), 'curr_last_refreshed': fields.DateTimeField(nullable=True, read_only=True), 'curr_reads': fields.IntegerField(), 'curr_read_bytes': fields.IntegerField(), 'curr_writes': fields.IntegerField(), 'curr_write_bytes': fields.IntegerField() } (後略) nova/notifications/objects/volume.py 参考: nova/objects/volume_usage.py populate_schemaメソッドを呼び出してObject(例ではVolumeUsageオブジェクト)の フィールドをNotification Payloadのフィールドにセットすることができる。 例: https://review.opendev.org/#/c/580345/ 参考: https://docs.openstack.org/nova/latest/reference/notifications.html#how-to-add-a-new-versioned-notification
  • 60. 60Copyright©2019 NTT corp. All Rights Reserved. 2. Notificationクラスの追加 nova/notifications/objects以下に追加する (Payloadと同じファイル) Versioned Notificationの追加方法 その2 (前略) @base.notification_sample('volume-usage.json') @nova_base.NovaObjectRegistry.register_notification class VolumeUsageNotification(base.NotificationBase): # Version 1.0: Initial version VERSION = '1.0' fields = { 'payload': fields.ObjectField('VolumeUsagePayload') } (後略) nova/notifications/objects/volume.py サンプルファイルを指定してdoc/notification_samples以下にそのファイルを追加する。 (doc/notification_samples/volume-usage.json) 1.で作成したNotification Payloadクラスを指定する
  • 61. 61Copyright©2019 NTT corp. All Rights Reserved. 3. Notificationを発行するメソッドの追加 nova/compute/utils.pyに追加 Versioned Notificationの追加方法 その3 (前略) from nova.objects import fields (中略) @rpc.if_notifications_enabled def notify_about_volume_usage(context, vol_usage, host): """Send versioned notification about the volume usage :param context: the request context :param vol_usage: the volume usage object :param host: the host emitting the notification """ payload = volume_notification.VolumeUsagePayload( vol_usage=vol_usage) notification = volume_notification.VolumeUsageNotification( context=context, priority=fields.NotificationPriority.INFO, publisher=notification_base.NotificationPublisher( host=host, source=fields.NotificationSource.COMPUTE), event_type=notification_base.EventType( object='volume', action=fields.NotificationAction.USAGE), payload=payload) notification.emit(context) (後略) 優先度をセット (AUDIT, CRITICAL, DEBUG, INFO, ERROR, WARN) Notificationを発行するNovaのプロセスをセット (API, COMPUTE, CONDUCTOR, SCHEDULER, 他) Actionをセット (UPDATE, DELETE, CREATE, 他) phaseがある場合は、phaseをセット (START, END, ERROR) phase=fields.NotificationPhase.START configオプションでversioned notificationが 有効になっていなければ メソッドの実行をスキップする。 必ず追加する。 nova/compute/utils.py
  • 62. 62Copyright©2019 NTT corp. All Rights Reserved. 4. Notificationを発行するメソッド(3.)を対象操作( 処理)に入れる Versioned Notificationの追加方法 その4 (前略) def _notify_volume_usage_detach(self, context, instance, bdm): (中略) vol_usage = objects.VolumeUsage(context) vol_usage.volume_id = bdm.volume_id vol_usage.instance_uuid = instance.uuid vol_usage.project_id = instance.project_id vol_usage.user_id = instance.user_id vol_usage.availability_zone = instance.availability_zone vol_usage.curr_reads = rd_req vol_usage.curr_read_bytes = rd_bytes vol_usage.curr_writes = wr_req vol_usage.curr_write_bytes = wr_bytes vol_usage.save(update_totals=True) (中略) compute_utils.notify_about_volume_usage(context, vol_usage, self.host) (後略) nova/compute/manager.py
  • 63. 63Copyright©2019 NTT corp. All Rights Reserved. 5. サンプルファイルのためのFunctional Testの追加 Versioned Notificationの追加方法 その5 (Unit TestとRelease noteも追加する) (前略) class TestVolumeUsageNotificationSample( notification_sample_base.NotificationSampleTestBase): (中略) def test_volume_usage_with_detaching_volume(self): server = self._setup_server_with_volume_attached() self.api.delete_server_volume(server['id'], self.cinder.SWAP_OLD_VOL) self._wait_for_notification('instance.volume_detach.end') # 0. volume_detach-start # 1. volume.usage # 2. volume_detach-end self.assertEqual(3, len(fake_notifier.VERSIONED_NOTIFICATIONS)) self._verify_notification( 'volume-usage', replacements={'instance_uuid': server['id']}, actual=fake_notifier.VERSIONED_NOTIFICATIONS[1]) (後略) nova/tests/functional/notification_sample_tests/test_volume.py doc/notification_samples/volume-usage.jsonを指定
  • 64. 64Copyright©2019 NTT corp. All Rights Reserved. セキュリティ
  • 65. 65Copyright©2019 NTT corp. All Rights Reserved. • ログやノーティフィケーションの出力 • センシティブな情報(パスワード等)はマスクする • oslo.uitlsのoslo_utils.strutils.mask_passwordを利用してマス クする • 特定のキーを持つDictを文字列にしたものを対象に置換を行なう • 以下(oslo.utilsのmaster)を参照 https://opendev.org/openstack/oslo.utils/src /commit/3ed4676f93996b 9f1d81a2826020d0c8cead4425/oslo_utils/strutils.py#L58-L62 • Fixの例 • https://review.opendev.org/#/c /558694/ • あるいはそもそも出力しない • Fixの例 • https://review.opendev.org/#/c /649775/ • データベースやメッセージング・ミドルウェアへの接続用URI(文 字列)は要注意 セキュリティ
  • 66. 66Copyright©2019 NTT corp. All Rights Reserved. • セキュリティを確保するための仕組み • 限られたコマンドしかroot権限で実行できないようにする • 例: ファイルシステム関連(mount、mkfs等) • 以前はroot.wrapsという仕組みだったが、privsepに置 き換えられる(Novaでは現在進行中) • oslo.privsepというライブラリが用意されている • nova/privsep以下にコマンド( oslo_concurrency.processutils.execute等)の呼び 出しが集約されている • 参考ドキュメント • Spec • https://specs.openstack.org/openstack/oslo- specs/specs/liberty/privsep.html • 使用方法 • https://docs.openstack.org/oslo.privsep/latest/user/index. html • プロジェクトへの新規追加方法(ブログ) • https://www.madebymikal.com/adding-oslo-privsep-to-a- new-project-a-worked-example/ Privsep (Privilege Separation Daemon)
  • 67. 67Copyright©2019 NTT corp. All Rights Reserved. Upgrade
  • 68. 68Copyright©2019 NTT corp. All Rights Reserved. • oslo.versionedobjects • https://docs.openstack.org/oslo.versionedobjects/lates t/ • オブジェクト • 仮想サーバ(Instance)、フレーバ(Flavor)などが持つ属性 と操作(状態変更、DBの更新等)を1つのクラスにまとめて( オブジェクトとして)扱っている • oslo.versionedobjectsの oslo_versionedobjects.base.VersionedObjectを継承する オブジェクトを利用(基底クラスとしてNovaObjectクラスが 定義されている) • ローリング・アップグレードの際に異なるバージョン( NとN+1)のnovaプロセスが稼働することに対応させ るためバージョン付けされている oslo.versionedobjects
  • 69. 69Copyright©2019 NTT corp. All Rights Reserved. • オブジェクトへの属性・操作(メソッド)の追加・変更 • 基本的に以下の場合はバージョンを上げなければならない(ただし 例外あり) • リモータブルなメソッドの追加・変更 • @base.remotable • @base.remotable_classmethod • 属性(フィールド)の追加・変更 • obj_make_compatibleの実装 • lazy-loadableなフィールドを追加したなら、obj_load_attrメソ ッドの実装 • 他にも修正が必要 • テストの対応 • 上記の変更を行なった場合は、オブジェクトのハッシュ値( Signature)が変更される • ハッシュ値(とバージョン)をテストに反映させる • nova/tests/unit/objects/test_objects.pyの「object_data」を更 新する • 参考 • https://docs.openstack.org/nova/latest/contributor/code- review.html#object-versions oslo.versionedobjects (続き)
  • 70. 70Copyright©2019 NTT corp. All Rights Reserved. • Novaのプロセス間の呼び出し • メッセージング・ミドルウェア(RabbitMQ等)を利用したプロセ ス間の呼び出し • call(返答を待つ=同期)とcast(一方通行=非同期)の2種類が ある • RPCにはバージョンが存在する • ローリング・アップグレードのため(NとN+1バージョンの同時稼 働のため) • Managerのメソッド自体の追加、メソッドのシグネチャの変更が あった場合は、マイナー・バージョンを上げる (Managerのメソッド自体を削除する場合はメジャー・バージョ ンを上げる) • RPC APIに後方互換性の処理を入れる • can_send_versionで送信可能なバージョンをチェックして後方互換 性の処理を入れる • Manager(要求を受ける側、各プロセス(nova-conductor、 nova-scheduler、nova-compute等)) • 各クラスにおいてmessaging.Targetで対応しているバージョンが定 義されている • 例: target = messaging.Target(version='5.1') RPC
  • 71. 71Copyright©2019 NTT corp. All Rights Reserved. • RPC関連ファイル • RPC API • nova/scheduler/rpcapi.py • nova/conductor/rpcapi.py • nova/compute/rpcapi.py • Manager • nova/scheduler/manager.py • nova/conductor/manager.py • nova/compute/manager.py • RPCのバージョンを上げた修正の例 • https://review.opendev.org/#/c/582417/ • 参考 • https://docs.openstack.org/nova/latest/contributor/co de-review.html#rpc-api-versions RPC (続き)
  • 72. 72Copyright©2019 NTT corp. All Rights Reserved. • サービス・バージョンとは • nova-computeがサポートしているCompute RPCのバージョ ンやサポートしている機能を表す • nova/objects/service.pyのSERVICE_VERSIONで定義 • どのような時に上げるのか • Compute RPCのバージョンを上げた場合 • nova-computeにおいて機能を追加した場合 • 操作対象の仮想サーバの存在するCompute Nodeで操作可能かチ ェックしてエラーを返す(アップグレードで異なるバージョンの nova-computeが混在しているケースを想定) • 例は次ページ サービス・バージョン (前略) # NOTE(danms): This is the global service version counter SERVICE_VERSION = 37 (後略)
  • 73. 73Copyright©2019 NTT corp. All Rights Reserved. • Compute: add support to abort queued live migration • https://review.opendev.org /#/c /568542/ • API: add support to abort queued live migration in microversion 2.65 • https://review.opendev.org /#/c /573136/ サービス・バージョンのアップの例 (前略) MIN_COMPUTE_ABORT_QUEUED_LIVE_MIGRATION = 34 (中略) @profiler.trace_cls("compute_api") class API(base.Base): (中略) @check_instance_lock @check_instance_state(task_state=[task_states.MIGRATING]) def live_migrate_abort(self, context, instance, migration_id, support_abort_in_queue=False): """Abort an in-progress live migration. (中略) if migration.status in queued_states: service = objects.Service.get_by_compute_host( context, instance.host) if service.version < MIN_COMPUTE_ABORT_QUEUED_LIVE_MIGRATION: raise exception.AbortQueuedLiveMigrationNotYetSupported( migration_id=migration_id, status=migration.status) allowed_states.extend(queued_states) (後略) nova/compute/api.py
  • 74. 74Copyright©2019 NTT corp. All Rights Reserved. • 非推奨 • Compute API (REST API)、Config option、Policy等 • 手順 • 非推奨とする • Compute API • あるマイクロバージョン以降は404 (Not Found)が返るようにする • API Referenceに非推奨であることを明記する • Release noteのdeprecationsセクションに記述する • 例: https://review.opendev.org/#/q/topic:bp/deprecate-api- proxies+status:merged • CLI、configオプション、他 • 非推奨であることの設定(configオプションなら、deprecated_sinceや deprecated_reason等の追加)や記述を行なう • 非推奨であることの警告メッセージをログ等に出力させる • ドキュメントに非推奨であることを明記する • Release noteのdeprecationsセクションに記述する • 次リリース以降に削除する • 関連箇所、関連ファイルを削除する • Release noteのupgradeセクションに記述する • Compute APIの場合はHTTPレスポンスコード 410 (Gone)を返すよう にする • 例: https://review.opendev.org/#/c /582943/ (https://review.opendev.org/#/q/topic:bp/remove-nova- network+status:merged) 非推奨の警告(Deprecation Warning) 参考: Policyのdeprecationの例 https://review.opendev.org/#/c/465505/
  • 75. 75Copyright©2019 NTT corp. All Rights Reserved. 非推奨への変更の例 非推奨の設定を行なう conf: Deprecate ‘keymap’ options https://review.opendev.org/#/c/483994/
  • 76. 76Copyright©2019 NTT corp. All Rights Reserved. 非推奨への変更の例(続き) 警告をログに出力する
  • 77. 77Copyright©2019 NTT corp. All Rights Reserved. ConfigオプションとPolicy
  • 78. 78Copyright©2019 NTT corp. All Rights Reserved. • Configオプション(nova.confで設定するオプション )の定義は、nova/confディレクトリ以下に集約され ている • 追加方法は次ページ以降 • 参考 • https://docs.openstack.org/nova/latest/contributor/co de-review.html#config-options Configオプションの追加・修正
  • 79. 79Copyright©2019 NTT corp. All Rights Reserved. Configオプションの追加 その1 (前略) from oslo_config import cfg (中略) zvm_opt_group = cfg.OptGroup('zvm', title='zVM Options', help=""" zvm options allows cloud administrator to configure related z/VM hypervisor driver to be used within an OpenStack deployment. zVM options are used when the compute_driver is set to use zVM (compute_driver=zvm.ZVMDriver) """) zvm_opts = [ cfg.URIOpt('cloud_connector_url', sample_default='http://zvm.example.org:8080/', help=""" URL to be used to communicate with z/VM Cloud Connector. """), cfg.StrOpt('ca_file', default=None, help=""" CA certificate file to be verified in httpd server with TLS enabled A string, it must be a path to a CA bundle to use. """), (中略) ] def register_opts(conf): conf.register_group(zvm_opt_group) conf.register_opts(zvm_opts, group=zvm_opt_group) def list_opts(): return {zvm_opt_group: zvm_opts} 1. nova/conf以下にファイルを追加し(必要な場合)、その中にオプションのグループとオプションを定義する。 既に適切なファイル(適切なオプションのグループ)がある場合は、その中にオプションを追加する。 オプションのグループの定義 (例はnova.confだとzvmセクションになる。) オプションを定義する。 定義方法は以下を参照 https://docs.openstack.org/oslo.config/latest/reference/defining.html 参考: https://review.opendev.org/#/c/523387/ nova/conf/zvm.py 次ページ tox -e genconfigでサンプルconfigファイルを出力するためのメソッド setup.cfgの解説参照
  • 80. 80Copyright©2019 NTT corp. All Rights Reserved. 2. 初期化(モジュールのimport)時に登録する処理の追加 Configオプションの追加 その2 nova/conf/__init__.py (前略) from nova.conf import zvm (中略) zvm.register_opts(CONF) (後略)
  • 81. 81Copyright©2019 NTT corp. All Rights Reserved. 3. Configオプションを使用する Configオプションの追加 その3 nova/virt/zvm/driver.py (前略) from nova import conf (中略) CONF = conf.CONF (中略) class ZVMDriver(driver.ComputeDriver): (中略) def __init__(self, virtapi): super(ZVMDriver, self).__init__(virtapi) self._validate_options() self._hypervisor = hypervisor.Hypervisor( CONF.zvm.cloud_connector_url, ca_file=CONF.zvm.ca_file) LOG.info("The zVM compute driver has been initialized.") (後略)
  • 82. 82Copyright©2019 NTT corp. All Rights Reserved. • 定義はnova/policies以下に集約されている • REST APIの処理のなかでcontext.can(nova.context. RequestContextクラスのcanメソッド)を呼び出して認 可を確認している (内部でnova/policy.pyのauthorizeメソッドを呼び出し ている) • authorizeメソッド内の初期化処理(initメソッドの呼び出 し)でEnforcerへのポリシー・ルールの登録が行なわれて いる。 • 登録するポリシー・ルールの取得は nova/policies/__init__.pyのlist_rulesメソッド( nova.policies.list_rules)を呼び出している。 • nova/policies/base.pyに以下の定数が定義されている。 • RULE_ADMIN_OR_OWNER • RULE_ADMIN_API • RULE_ANY Policyの追加・修正
  • 83. 83Copyright©2019 NTT corp. All Rights Reserved. 1. nova/policies以下にファイルを追加し(必要な場合)、その中にポリシーを定義する。 既に適切なファイル(適切なポリシーの組)がある場合は、その中にポリシーを追加する。 Policyの追加 その1 (前略) from oslo_policy import policy from nova.policies import base POLICY_ROOT = 'os_compute_api:os-server-groups:%s' server_groups_policies = [ policy.DocumentedRuleDefault( POLICY_ROOT % 'create', base.RULE_ADMIN_OR_OWNER, "Create a new server group", [ { 'path': '/os-server-groups', 'method': 'POST' } ] ), (中略) ] def list_rules(): return server_groups_policies nova/policies/server_groups.py 詳細は以下を参照のこと。 https://docs.openstack.org/oslo.policy/latest/user/usage.html#registering-policy-defaults-in-code
  • 84. 84Copyright©2019 NTT corp. All Rights Reserved. • ポリシーのルール一覧取得メソッドへの追加 Policyの追加 その2 (前略) from nova.policies import server_groups (中略) def list_rules(): return itertools.chain( (中略) server_groups.list_rules(), (中略) ) nova/policies/__init__.py
  • 85. 85Copyright©2019 NTT corp. All Rights Reserved. • Configファイル生成、Policyファイル生成、コマンド(プロセ ス、例えばnova-api、nova-compute)の「エントリー・ポ イント」([entry_points])他が定義されている • console_scripts(pbr(※)によるPythonスクリプトの生成) • oslo.config.opts • tox –e genconfigでnova.confのサンプルを出力する時にconfigの一覧を 取得するメソッドを設定 • https://docs.openstack.org/oslo.config/latest/cli/generator.html #defining-option-discovery-entry-points • oslo.policy.policies • tox –e genpolicyでpolicy.yamlのサンプルを出力する時にpolicyの一覧 を取得するメソッドを設定 • https://docs.openstack.org/oslo.policy/latest/user/usage.html#s ample-file-generation setup.cfg (前略) console_scripts = nova-api = nova.cmd.api:main (後略) ※ https://docs.openstack.org/pbr/latest/
  • 86. 86Copyright©2019 NTT corp. All Rights Reserved. Backport
  • 87. 87Copyright©2019 NTT corp. All Rights Reserved. • 新機能(Blueprint)は基本的にbackportしない (Bug Fixで重要度が高いものが中心) • 基本的にはmasterにmergeして、より新しいstable ブランチから順にbackportする • 例外的にstableブランチのみにパッチが提出・適用さ れる場合がある • Clean backportできるケースもあるが、Conflictが 発生して、そのままではbackportできないケースもあ る • masterでのパッチ作成時にBugの重要度から backportの要否を検討してBackportしやすいように 作成することも重要 Stableブランチへのbackport
  • 88. 88Copyright©2019 NTT corp. All Rights Reserved. Commit messageの例(stable/rockyへのbackport) Fix resetting non-persistent fields when saving obj The 'requested_destination', 'network_metadata', 'retry' fields in the RequestSpec object are reset when saving the object currently. (中略) So make them not be reset when saving the object. Conflicts: nova/objects/request_spec.py nova/tests/unit/objects/test_request_spec.py Conflicts are due to not including the following changes in rocky. I53e5debcffd6de2b3a2ff838e7f5da33fa1a82b8 Idaed39629095f86d24a54334c699a26c218c6593 Change-Id: I2131558f0edfe603ee1e8d8bae66a3caf5182a58 Closes-Bug: #1815153 (cherry picked from commit 67d5970445818f2f245cf1b6d9d46c36fb220f04) Conflictが起きたファイルとその理由を書く ※ https://review.opendev.org/#/c/643215/ Change-Idはmasterと同じIDとする master、対象のstable branchよりも 新しいstable branchのcommit IDを 記載する。
  • 89. 89Copyright©2019 NTT corp. All Rights Reserved. Pythonパッケージとライブラリ
  • 90. 90Copyright©2019 NTT corp. All Rights Reserved. • 必要なPythonのパッケージ(PyPI)のバージョンを定義 • グローバルな(OpenStackプロジェクト全体の)定義が存 在する • Requirementsプロジェクト • https://docs.openstack.org/requirements/latest/ • https://opendev.org/openstack/requirements • ローカル(Nova)の定義ファイル • グローバルの定義と整合性を取る必要がある • requirements.txt • Novaのプロセスが稼働するのに必要なパッケージの情報を定義 • test-requirements.txt • テストを実行するために必要なパッケージの情報を定義 • doc/requirements.txt • ドキュメント生成に必要なパッケージの情報を定義 • lower-constraints.txt • 必要なパッケージのバージョンの下限を定義 • 上記3つのファイルの下限に合わせて更新する requirements
  • 91. 91Copyright©2019 NTT corp. All Rights Reserved. • 共通ライブラリとしてOsloがある • oslo.utils • oslo.config 他(数多くあります) • 共通ライブラリを利用するように修正する • OpenStackのプロジェクトで重複したコードを持たないように するため • 貢献するには • osloのリリースを新機能をウォッチして適用できないか検討す る • Gerritにpushされた他のプロジェクトのパッチを参考にする Osloの利用
  • 92. 92Copyright©2019 NTT corp. All Rights Reserved. Oslo利用の例 https://review.opendev.org/#/c/466201/
  • 93. 93Copyright©2019 NTT corp. All Rights Reserved. 他のプロジェクトとの連携
  • 94. 94Copyright©2019 NTT corp. All Rights Reserved. • Novaは主に以下のプロジェクトと連携している • Keystone • nova/utils.pyのget_ksa_adapterメソッドに注目 他 • Placement • (ここでは省略) • Neutron • nova/network/neutronv2以下 • Glance • nova/image以下 • Cinder • nova/volume以下 • Ironic • nova/virt/ironic以下 • Cyborg(予定) • Request ID • 各プロジェクトへのクライアントからのリクエスト送信時にGlobal Request IDをHTTPリクエストヘッダにセットする • 参考 • https://review.opendev.org/#/q/topic:bug/1734625 他のプロジェクトの連携
  • 95. 95Copyright©2019 NTT corp. All Rights Reserved. TIPS
  • 96. 96Copyright©2019 NTT corp. All Rights Reserved. • git blame ファイルのパス • そのファイルにある行ごとにその行を変更したCommit( Commit ID)が分かる • ただし、現在存在しない行(削除されてしまった行)がどの Commitで削除されたかは分からない • 例: git blame nova/compute/api.py • git log -S 文字列 • 指定した文字列を含む現在存在しない行(削除されてしまった 行)がどのCommitで削除されたか見つけるために使用できる • Sオプション • Look for differences that change the number of occurrences of the specified string (i.e. addition/deletion) in a file. Intended for the scripter’s use.(man git logより) • 文字列にマッチする行の追加や削除があったパッチを見る Gitコマンド
  • 97. 97Copyright©2019 NTT corp. All Rights Reserved. • Hound(OpenStack Code Search) • OpenStack関連プロジェクトの横断的な検索 • http://codesearch.openstack.org/ • Paste • ログやコマンドの出力を貼り付けて使用することにより、レビ ューのコメント作成に役立つ • http://paste.openstack.org/ • Github • Commit IDと行を指定してソースコードの該当箇所を示す • 例えば https://github.com/openstack/nova/blob/ed49947d5ac dc6435e0a76a20b8341228fbe8d27/nova/compute/api. py#L1794-L1808 便利ツール
  • 98. 98Copyright©2019 NTT corp. All Rights Reserved. • tox(tox.ini) • bindep • https://docs.openstack.org/infra/bindep/readme.html • Nova固有の事項 • Compute Driver • Cells V2 この資料にはないが理解が必要なこと
  • 99. 99Copyright©2019 NTT corp. All Rights Reserved. • ソースコードを読もう! • 他の人のPatchのレビューを行なうことも推奨 • 関係する他のプロジェクトのリポジトリも覗いてみよう (特にosloライブラリ) • 読んでいれば見えてくるものがある • ソースコードを書いてPatchをGerritにpushして貢献 しよう! • そして、より高いレベルでのコミュニティへの貢献を目 指そう! 最後に
  • 100. 100Copyright©2019 NTT corp. All Rights Reserved. ご清聴ありがとうございました