From: Redouane Kachach Date: Mon, 9 May 2022 15:17:30 +0000 (+0200) Subject: mgr/cephadm: fixing yaml parsing during bootstrap X-Git-Tag: v16.2.11~86^2~7^2~4 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=83c999b2fbf4c9fabf1255ef1a09bd50ce2d2597;p=ceph.git mgr/cephadm: fixing yaml parsing during bootstrap Fixes: https://tracker.ceph.com/issues/55555 Signed-off-by: Redouane Kachach (cherry picked from commit 4af8a884416509daa65898335de3d8a355890675) --- diff --git a/src/cephadm/cephadm b/src/cephadm/cephadm index 2e14bf609be4b..554616468c9ff 100755 --- a/src/cephadm/cephadm +++ b/src/cephadm/cephadm @@ -4466,7 +4466,7 @@ def _parse_yaml_docs(f: Iterable[str]) -> List[List[str]]: docs = [] current_doc = [] # type: List[str] for line in f: - if '---' in line: + if re.search(r'^---\s+', line): if current_doc: docs.append(current_doc) current_doc = [] diff --git a/src/cephadm/tests/test_cephadm.py b/src/cephadm/tests/test_cephadm.py index 7813d04493d30..373df65ef3ac4 100644 --- a/src/cephadm/tests/test_cephadm.py +++ b/src/cephadm/tests/test_cephadm.py @@ -2022,7 +2022,8 @@ class TestPull: class TestApplySpec: def test_parse_yaml(self, cephadm_fs): - yaml = '''service_type: host + yaml = '''--- +service_type: host hostname: vm-00 addr: 192.168.122.44 labels: @@ -2034,16 +2035,46 @@ hostname: vm-01 addr: 192.168.122.247 labels: - grafana ---- +--- service_type: host hostname: vm-02 -addr: 192.168.122.165''' +addr: 192.168.122.165 +--- +--- +service_type: rgw +service_id: myrgw +spec: + rgw_frontend_ssl_certificate: | + -----BEGIN PRIVATE KEY----- + V2VyIGRhcyBsaWVzdCBpc3QgZG9vZi4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFt + ZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gbm9udW15 + IGVpcm1vZCB0ZW1wb3IgaW52aWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWdu + YSBhbGlxdXlhbSBlcmF0LCBzZWQgZGlhbSB2b2x1cHR1YS4gQXQgdmVybyBlb3Mg + ZXQgYWNjdXNhbSBldCBqdXN0byBkdW8= + -----END PRIVATE KEY----- + -----BEGIN CERTIFICATE----- + V2VyIGRhcyBsaWVzdCBpc3QgZG9vZi4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFt + ZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gbm9udW15 + IGVpcm1vZCB0ZW1wb3IgaW52aWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWdu + YSBhbGlxdXlhbSBlcmF0LCBzZWQgZGlhbSB2b2x1cHR1YS4gQXQgdmVybyBlb3Mg + ZXQgYWNjdXNhbSBldCBqdXN0byBkdW8= + -----END CERTIFICATE----- + ssl: true +--- +''' cephadm_fs.create_file('spec.yml', contents=yaml) - retdic = [{'service_type': 'host', 'hostname': 'vm-00', 'addr': '192.168.122.44', 'labels': '- example1- example2'}, {'service_type': 'host', 'hostname': 'vm-01', 'addr': '192.168.122.247', 'labels': '- grafana'}, - {'service_type': 'host', 'hostname': 'vm-02', 'addr': '192.168.122.165'}] + {'service_type': 'host', 'hostname': 'vm-02', 'addr': '192.168.122.165'}, + {'service_id': 'myrgw', + 'service_type': 'rgw', + 'spec': + 'rgw_frontend_ssl_certificate: |-----BEGIN PRIVATE ' + 'KEY-----V2VyIGRhcyBsaWVzdCBpc3QgZG9vZi4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gbm9udW15IGVpcm1vZCB0ZW1wb3IgaW52aWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdXlhbSBlcmF0LCBzZWQgZGlhbSB2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8=-----END ' + 'PRIVATE KEY----------BEGIN ' + 'CERTIFICATE-----V2VyIGRhcyBsaWVzdCBpc3QgZG9vZi4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gbm9udW15IGVpcm1vZCB0ZW1wb3IgaW52aWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdXlhbSBlcmF0LCBzZWQgZGlhbSB2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8=-----END ' + 'CERTIFICATE-----ssl: true'}] with open('spec.yml') as f: dic = cd.parse_yaml_objs(f) diff --git a/src/pybind/mgr/orchestrator/module.py b/src/pybind/mgr/orchestrator/module.py index b26be92fd2dd1..f4b0c24c11a31 100644 --- a/src/pybind/mgr/orchestrator/module.py +++ b/src/pybind/mgr/orchestrator/module.py @@ -1019,8 +1019,11 @@ Usage: if inbuf: if service_type or placement or unmanaged: raise OrchestratorValidationError(usage) - content: Iterator = yaml.safe_load_all(inbuf) + yaml_objs: Iterator = yaml.safe_load_all(inbuf) specs: List[Union[ServiceSpec, HostSpec]] = [] + # YAML '---' document separator with no content generates + # None entries in the output. Let's skip them silently. + content = [o for o in yaml_objs if o is not None] for s in content: spec = json_to_generic_spec(s)