From f49b600fb8782cf38925bbc04ead75ca0980837b Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Sat, 15 Feb 2020 11:40:08 -0600 Subject: [PATCH] cephadm: separate out require files in config-json - Put files in a subsection of the config-json. - Also, consolidate the sanity checks into one place (command_deploy) instead of duplicating them in create_daemon_dirs. Signed-off-by: Sage Weil --- src/cephadm/cephadm | 56 +++++++------- src/cephadm/samples/grafana.json | 114 ++++++++++++++-------------- src/cephadm/samples/prometheus.json | 30 ++++---- src/pybind/mgr/cephadm/module.py | 6 +- 4 files changed, 104 insertions(+), 102 deletions(-) diff --git a/src/cephadm/cephadm b/src/cephadm/cephadm index bdfc281c0b8..8af3a6e455a 100755 --- a/src/cephadm/cephadm +++ b/src/cephadm/cephadm @@ -113,7 +113,7 @@ class Monitoring(object): "--storage.tsdb.path=/prometheus", "--web.listen-address=:{}".format(port_map['prometheus'][0]), ], - "config-json": [ + "config-json-files": [ "prometheus.yml", ], }, @@ -130,7 +130,7 @@ class Monitoring(object): "cpus": "2", "memory": "4GB", "args": [], - "config-json": [ + "config-json-files": [ "grafana.ini", "provisioning/datasources/ceph-dashboard.yml", "certs/cert_file", @@ -142,13 +142,14 @@ class Monitoring(object): "cpus": "2", "memory": "2GB", "args": [], - "config-json": [ + "config-json-files": [ "alertmanager.yml", - "_peers", + ], + "config-json-args": [ + "peers", ], }, - } - } # type: Dict[str, dict] + } # type: ignore def attempt_bind(s, address, port): # type (str) -> None @@ -907,7 +908,7 @@ def get_daemon_args(fsid, daemon_type, daemon_id): r += metadata.get('args', list()) if daemon_type == 'alertmanager': config = get_parm(args.config_json) - peers = config.get('_peers', list()) # type: ignore + peers = config.get('peers', list()) # type: ignore for peer in peers: r += ["--cluster.peer={}".format(peer)] return r @@ -931,13 +932,8 @@ def create_daemon_dirs(fsid, daemon_type, daemon_id, uid, gid, f.write(keyring) if daemon_type in Monitoring.components.keys(): - - received_config = get_parm(args.config_json) - required_config = Monitoring.components[daemon_type].get('config-json', list()) - if required_config: - if not received_config or not all(c in received_config.keys() for c in required_config): - raise Error("{} deployment requires config-json which must " - "contain settings for {}".format(daemon_type.capitalize(), ', '.join(required_config))) + config = get_parm(args.config_json) # type: ignore + required_files = Monitoring.components[daemon_type].get('config-json-files', list()) # Set up directories specific to the monitoring component config_dir = '' @@ -962,14 +958,11 @@ def create_daemon_dirs(fsid, daemon_type, daemon_id, uid, gid, # populate the config directory for the component from the config-json - for fname in required_config: - # config entries prefixed by '_' denote a setting not a config file - if fname.startswith('_'): - continue - if isinstance(received_config[fname], list): - content = '\n'.join(received_config[fname]) + for fname in required_files: + if isinstance(config['files'][fname], list): # type: ignore + content = '\n'.join(config['files'][fname]) # type: ignore else: - content = received_config[fname] + content = config['files'][fname] # type: ignore with open(os.path.join(data_dir_root, config_dir, fname), 'w') as f: os.fchown(f.fileno(), uid, gid) @@ -2000,15 +1993,18 @@ def command_deploy(): elif args.image == DEFAULT_IMAGE: raise Error("--image parameter must be supplied for {}".format(daemon_type)) - if daemon_type in ['prometheus', 'grafana', 'alertmanager']: - if not args.config_json: - raise Error("config-json parameter is needed when deploying {} service".format(daemon_type)) - metadata = Monitoring.components[daemon_type] # type: ignore - required_keys = metadata.get('config_json', list()) # type: ignore - received = get_parm(args.config_json) - if not all([req in received.keys() - for req in required_keys]): - raise Error("config-json must contain {} section(s)".format(','.join(required_keys))) + # make sure provided config-json is sufficient + config = get_parm(args.config_json) # type: ignore + required_files = Monitoring.components[daemon_type].get('config-json-files', list()) + required_args = Monitoring.components[daemon_type].get('config-json-args', list()) + if required_files: + if not config or not all(c in config.get('files', {}).keys() for c in required_files): # type: ignore + raise Error("{} deployment requires config-json which must " + "contain file content for {}".format(daemon_type.capitalize(), ', '.join(required_files))) + if required_args: + if not config or not all(c in config.keys() for c in required_args): # type: ignore + raise Error("{} deployment requires config-json which must " + "contain arg for {}".format(daemon_type.capitalize(), ', '.join(required_args))) if daemon_type == 'prometheus': uid, gid = extract_uid_gid(file_path='/etc/prometheus') diff --git a/src/cephadm/samples/grafana.json b/src/cephadm/samples/grafana.json index bda4887cdbf..0e0689b7e3b 100644 --- a/src/cephadm/samples/grafana.json +++ b/src/cephadm/samples/grafana.json @@ -1,5 +1,6 @@ { - "grafana.ini": [ + "files": { + "grafana.ini": [ "[users]", " default_theme = light", "[auth.anonymous]", @@ -17,8 +18,8 @@ " admin_user = admin", " admin_password = admin", " allow_embedding = true" - ], - "provisioning/datasources/ceph-dashboard.yml": [ + ], + "provisioning/datasources/ceph-dashboard.yml": [ "deleteDatasources:", " - name: 'Dashboard'", " orgId: 1", @@ -32,57 +33,58 @@ " basicAuth: false", " isDefault: true", " editable: false" - ], - "certs/cert_file": [ - "-----BEGIN CERTIFICATE-----", - "MIIDLTCCAhWgAwIBAgIUEH0mq6u93LKsWlNXst5pxWcuqkQwDQYJKoZIhvcNAQEL", - "BQAwJjELMAkGA1UECgwCSVQxFzAVBgNVBAMMDmNlcGgtZGFzaGJvYXJkMB4XDTIw", - "MDEwNTIyNDYyMFoXDTMwMDEwMjIyNDYyMFowJjELMAkGA1UECgwCSVQxFzAVBgNV", - "BAMMDmNlcGgtZGFzaGJvYXJkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC", - "AQEAqxh6eO0NTZJe+DoKZG/kozJCf+83eB3gWzwXoNinRmV/49f5WPR20DIxAe0R", - "saO6XynJXTrhvXT1bsARUq+LSmjWNFoYXopFuOJhGdWn4dmpuHwtpcFv2kjzNOKj", - "U2EG8j6bsRp1jFAzn7kdbSWT0UHySRXp9DPAjDiF3LjykMXiJMReccFXrB1pRi93", - "nJxED8d6oT5GazGB44svb+Zi6ABamZu5SDJC1Fr/O5rWFNQkH4hQEqDPj1817H9O", - "sm0mZiNy77ZQuAzOgZN153L3QOsyJismwNHfAMGMH9mzPKOjyhc13VlZyeEzml8p", - "ZpWQ2gi8P2r/FAr8bFL3MFnHKwIDAQABo1MwUTAdBgNVHQ4EFgQUZg3v7MX4J+hx", - "w3HENCrUkMK8tbwwHwYDVR0jBBgwFoAUZg3v7MX4J+hxw3HENCrUkMK8tbwwDwYD", - "VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAaR/XPGKwUgVwH3KXAb6+", - "s9NTAt6lCmFdQz1ngoqFSizW7KGSXnOgd6xTiUCR0Tjjo2zKCwhIINaI6mwqMbrg", - "BOjb7diaqwFaitRs27AtdmaqMGndUqEBUn/k64Ld3VPGL4p0W2W+tXsyzZg1qQIn", - "JXb7c4+oWzXny7gHFheYQTwnHzDcNOf9vJiMGyYYvU1xTOGucu6dwtOVDDe1Z4Nq", - "AyIYWDScRr2FeAOXyx4aW2v5bjpTxvP+79/OOBbQ+p4y5F4PDrPeOSweGoo6huTR", - "+T+YI9Jfw2XCgV7NHWhfdt3fHHwUQzO6WszWU557pmCODLvXWsQ8P+GRiG7Nywm3", - "uA==", - "-----END CERTIFICATE-----" - ], - "certs/cert_key": [ - "-----BEGIN PRIVATE KEY-----", - "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCrGHp47Q1Nkl74", - "Ogpkb+SjMkJ/7zd4HeBbPBeg2KdGZX/j1/lY9HbQMjEB7RGxo7pfKcldOuG9dPVu", - "wBFSr4tKaNY0WhheikW44mEZ1afh2am4fC2lwW/aSPM04qNTYQbyPpuxGnWMUDOf", - "uR1tJZPRQfJJFen0M8CMOIXcuPKQxeIkxF5xwVesHWlGL3ecnEQPx3qhPkZrMYHj", - "iy9v5mLoAFqZm7lIMkLUWv87mtYU1CQfiFASoM+PXzXsf06ybSZmI3LvtlC4DM6B", - "k3XncvdA6zImKybA0d8AwYwf2bM8o6PKFzXdWVnJ4TOaXylmlZDaCLw/av8UCvxs", - "UvcwWccrAgMBAAECggEAeBv0BiYrm5QwdUORfhaKxAIJavRM1Vbr5EBYOgM90o54", - "bEN2ePsM2XUSsE5ziGfu8tVL1dX7GNwdW8UbpBc1ymO0VAYXa27YKUVKcy9o7oS1", - "v5v1E5Kq6esiSLL9gw/vJ2nKNFblxD2dL/hs7u1dSp5n7uSiW1tlRUp8toljRzts", - "1Cenp0J/a82HwWDE8j/H9NvitTOZ2cdwJ76V8GkBynlvr2ARjRfZGx0WXEJmoZYD", - "YUQVU303DB6Q2tkFco4LbPofkuhhMPhXsz3fZ/blHj/c78tqP9L5sQ29oqoPE1pS", - "DBOwKC/eoi5FY34RdLNL0dKq9MzbuYqEcCfZOJgxoQKBgQDf+5XF+aXQz2OmSaj6", - "1Yr+3KAKdfX/AYp22X1Wy4zWcZlgujgwQ1FG0zay8HVBM0/xn4UgOtcKCoXibePh", - "ag1t8aZINdRE1JcMzKmZoSvU9Xk30CNvygizuJVEKsJFPDbPzCpauDSplzcQb4pZ", - "wepucPuowkPMBx0iU3x0qSThWwKBgQDDjYs7d30xxSqWWXyCOZshy7UtHMNfqP15", - "kDfTXIZzuHvDf6ZNci10VY1eDZbpZfHgc6x1ElbKv2H4dYsgkENJZUi1YQDpVPKq", - "4N5teNykgAuagiR7dRFltSju3S7hIE6HInTv3hShaFPymlEE7zuBMuEUcuvYz5YN", - "RjxsvypKcQKBgCuuV+Y1KqZPW8K5SNAqRyIvCrMfkCr8NPG6tpvvtHa5zsyzZHPd", - "HQOv+1HoXSWrCSM5FfBUKU3XAYdIIRH76cSQRPp+LPiDcTXY0Baa/P5aJRrCZ7bM", - "cugBznJt2FdCR/o8eeIZXIPabq2w4w1gKQUC2cFuqWQn2wGvwGzL89pTAoGAAfpx", - "mSVpT9KVzrWTC+I3To04BP/QfixAfDVYSzwZZBxOrDijXw8zpISlDHmIuE2+t62T", - "5g9Mb3qmLBRMVwT+mUR8CtGzZ6jjV5U0yti5KrTc6TA93D3f8i51/oygR8jC4p0X", - "n8GYZdWfW8nx3eHpsTHpkwJinmvjMbkvLU51yBECgYAnUAMyhNOWjbYS5QWd8i1W", - "SFQansVDeeT98RebrzmGwlgrCImHItJz0Tz8gkNB3+S2B2balqT0WHaDxQ8vCtwX", - "xB4wd+gMomgdYtHGRnRwj1UyRXDk0c1TgGdRjOn3URaezBMibHTQSbFgPciJgAuU", - "mEl75h1ToBX9yvnH39o50g==", - "-----END PRIVATE KEY-----" - ] + ], + "certs/cert_file": [ + "-----BEGIN CERTIFICATE-----", + "MIIDLTCCAhWgAwIBAgIUEH0mq6u93LKsWlNXst5pxWcuqkQwDQYJKoZIhvcNAQEL", + "BQAwJjELMAkGA1UECgwCSVQxFzAVBgNVBAMMDmNlcGgtZGFzaGJvYXJkMB4XDTIw", + "MDEwNTIyNDYyMFoXDTMwMDEwMjIyNDYyMFowJjELMAkGA1UECgwCSVQxFzAVBgNV", + "BAMMDmNlcGgtZGFzaGJvYXJkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC", + "AQEAqxh6eO0NTZJe+DoKZG/kozJCf+83eB3gWzwXoNinRmV/49f5WPR20DIxAe0R", + "saO6XynJXTrhvXT1bsARUq+LSmjWNFoYXopFuOJhGdWn4dmpuHwtpcFv2kjzNOKj", + "U2EG8j6bsRp1jFAzn7kdbSWT0UHySRXp9DPAjDiF3LjykMXiJMReccFXrB1pRi93", + "nJxED8d6oT5GazGB44svb+Zi6ABamZu5SDJC1Fr/O5rWFNQkH4hQEqDPj1817H9O", + "sm0mZiNy77ZQuAzOgZN153L3QOsyJismwNHfAMGMH9mzPKOjyhc13VlZyeEzml8p", + "ZpWQ2gi8P2r/FAr8bFL3MFnHKwIDAQABo1MwUTAdBgNVHQ4EFgQUZg3v7MX4J+hx", + "w3HENCrUkMK8tbwwHwYDVR0jBBgwFoAUZg3v7MX4J+hxw3HENCrUkMK8tbwwDwYD", + "VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAaR/XPGKwUgVwH3KXAb6+", + "s9NTAt6lCmFdQz1ngoqFSizW7KGSXnOgd6xTiUCR0Tjjo2zKCwhIINaI6mwqMbrg", + "BOjb7diaqwFaitRs27AtdmaqMGndUqEBUn/k64Ld3VPGL4p0W2W+tXsyzZg1qQIn", + "JXb7c4+oWzXny7gHFheYQTwnHzDcNOf9vJiMGyYYvU1xTOGucu6dwtOVDDe1Z4Nq", + "AyIYWDScRr2FeAOXyx4aW2v5bjpTxvP+79/OOBbQ+p4y5F4PDrPeOSweGoo6huTR", + "+T+YI9Jfw2XCgV7NHWhfdt3fHHwUQzO6WszWU557pmCODLvXWsQ8P+GRiG7Nywm3", + "uA==", + "-----END CERTIFICATE-----" + ], + "certs/cert_key": [ + "-----BEGIN PRIVATE KEY-----", + "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCrGHp47Q1Nkl74", + "Ogpkb+SjMkJ/7zd4HeBbPBeg2KdGZX/j1/lY9HbQMjEB7RGxo7pfKcldOuG9dPVu", + "wBFSr4tKaNY0WhheikW44mEZ1afh2am4fC2lwW/aSPM04qNTYQbyPpuxGnWMUDOf", + "uR1tJZPRQfJJFen0M8CMOIXcuPKQxeIkxF5xwVesHWlGL3ecnEQPx3qhPkZrMYHj", + "iy9v5mLoAFqZm7lIMkLUWv87mtYU1CQfiFASoM+PXzXsf06ybSZmI3LvtlC4DM6B", + "k3XncvdA6zImKybA0d8AwYwf2bM8o6PKFzXdWVnJ4TOaXylmlZDaCLw/av8UCvxs", + "UvcwWccrAgMBAAECggEAeBv0BiYrm5QwdUORfhaKxAIJavRM1Vbr5EBYOgM90o54", + "bEN2ePsM2XUSsE5ziGfu8tVL1dX7GNwdW8UbpBc1ymO0VAYXa27YKUVKcy9o7oS1", + "v5v1E5Kq6esiSLL9gw/vJ2nKNFblxD2dL/hs7u1dSp5n7uSiW1tlRUp8toljRzts", + "1Cenp0J/a82HwWDE8j/H9NvitTOZ2cdwJ76V8GkBynlvr2ARjRfZGx0WXEJmoZYD", + "YUQVU303DB6Q2tkFco4LbPofkuhhMPhXsz3fZ/blHj/c78tqP9L5sQ29oqoPE1pS", + "DBOwKC/eoi5FY34RdLNL0dKq9MzbuYqEcCfZOJgxoQKBgQDf+5XF+aXQz2OmSaj6", + "1Yr+3KAKdfX/AYp22X1Wy4zWcZlgujgwQ1FG0zay8HVBM0/xn4UgOtcKCoXibePh", + "ag1t8aZINdRE1JcMzKmZoSvU9Xk30CNvygizuJVEKsJFPDbPzCpauDSplzcQb4pZ", + "wepucPuowkPMBx0iU3x0qSThWwKBgQDDjYs7d30xxSqWWXyCOZshy7UtHMNfqP15", + "kDfTXIZzuHvDf6ZNci10VY1eDZbpZfHgc6x1ElbKv2H4dYsgkENJZUi1YQDpVPKq", + "4N5teNykgAuagiR7dRFltSju3S7hIE6HInTv3hShaFPymlEE7zuBMuEUcuvYz5YN", + "RjxsvypKcQKBgCuuV+Y1KqZPW8K5SNAqRyIvCrMfkCr8NPG6tpvvtHa5zsyzZHPd", + "HQOv+1HoXSWrCSM5FfBUKU3XAYdIIRH76cSQRPp+LPiDcTXY0Baa/P5aJRrCZ7bM", + "cugBznJt2FdCR/o8eeIZXIPabq2w4w1gKQUC2cFuqWQn2wGvwGzL89pTAoGAAfpx", + "mSVpT9KVzrWTC+I3To04BP/QfixAfDVYSzwZZBxOrDijXw8zpISlDHmIuE2+t62T", + "5g9Mb3qmLBRMVwT+mUR8CtGzZ6jjV5U0yti5KrTc6TA93D3f8i51/oygR8jC4p0X", + "n8GYZdWfW8nx3eHpsTHpkwJinmvjMbkvLU51yBECgYAnUAMyhNOWjbYS5QWd8i1W", + "SFQansVDeeT98RebrzmGwlgrCImHItJz0Tz8gkNB3+S2B2balqT0WHaDxQ8vCtwX", + "xB4wd+gMomgdYtHGRnRwj1UyRXDk0c1TgGdRjOn3URaezBMibHTQSbFgPciJgAuU", + "mEl75h1ToBX9yvnH39o50g==", + "-----END PRIVATE KEY-----" + ] + } } diff --git a/src/cephadm/samples/prometheus.json b/src/cephadm/samples/prometheus.json index e4c8cb80fec..64727fb591e 100644 --- a/src/cephadm/samples/prometheus.json +++ b/src/cephadm/samples/prometheus.json @@ -1,15 +1,17 @@ { -"prometheus.yml": [ -"global:", -" scrape_interval: 5s", -" evaluation_interval: 10s", -"", -"rule_files: ", -" - '/etc/prometheus/alerting/*'", -"", -"scrape_configs:", -" - job_name: 'prometheus'", -" static_configs:", -" - targets: ['localhost:9095']" -] -} \ No newline at end of file + "files": { + "prometheus.yml": [ + "global:", + " scrape_interval: 5s", + " evaluation_interval: 10s", + "", + "rule_files: ", + " - '/etc/prometheus/alerting/*'", + "", + "scrape_configs:", + " - job_name: 'prometheus'", + " static_configs:", + " - targets: ['localhost:9095']" + ] + } +} diff --git a/src/pybind/mgr/cephadm/module.py b/src/pybind/mgr/cephadm/module.py index 66d9ccad198..75a2ca024f4 100644 --- a/src/pybind/mgr/cephadm/module.py +++ b/src/pybind/mgr/cephadm/module.py @@ -2151,7 +2151,8 @@ class CephadmOrchestrator(MgrModule, orchestrator.OrchestratorClientMixin): t = t.split('/')[2] mgr_scrape_list = [t] j = json.dumps({ - 'prometheus.yml': """# generated by cephadm + 'files': { + 'prometheus.yml': """# generated by cephadm global: scrape_interval: 5s evaluation_interval: 10s @@ -2163,7 +2164,8 @@ scrape_configs: - targets: {mgr_scrape_list} """.format( mgr_scrape_list=str(mgr_scrape_list) - ) + ), + }, }) return j -- 2.39.5