Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(197)

Side by Side Diff: services/catalog/public/tools/generate_manifest.py

Issue 2645973006: [Service Manager] Get rid of dynamic service discovery (Closed)
Patch Set: . Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « services/catalog/public/tools/catalog.gni ('k') | services/catalog/reader.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright 2016 The Chromium Authors. All rights reserved. 2 # Copyright 2016 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 """Generates a static catalog manifest to be loaded at runtime. This includes 6 """Generates a static catalog manifest to be loaded at runtime. This includes
7 embedded service manifests for every supported service, as well as information 7 embedded service manifests for every supported service, as well as information
8 indicating how to start each service.""" 8 indicating how to start each service."""
9 9
10 import argparse 10 import argparse
(...skipping 25 matching lines...) Expand all
36 raise Exception("Manifest %s missing \"name\" key." % filename) 36 raise Exception("Manifest %s missing \"name\" key." % filename)
37 return manifest["name"], manifest 37 return manifest["name"], manifest
38 38
39 39
40 def AddServiceEntryToCatalog(services, name, entry): 40 def AddServiceEntryToCatalog(services, name, entry):
41 if name in services: 41 if name in services:
42 raise Exception("Duplicate service entry for %s" % name) 42 raise Exception("Duplicate service entry for %s" % name)
43 services[name] = entry 43 services[name] = entry
44 44
45 45
46 def SanityCheckCatalog(catalog):
47 """Ensures any given service name appears only once within the catalog."""
48 known_services = set()
49
50 def has_no_dupes(root):
51 if "name" in root:
52 name = root["name"]
53 if name in known_services:
54 raise ValueError("Duplicate catalog entry found for service: %s" % name)
55 known_services.add(name)
56
57 if "services" not in root:
58 return True
59
60 return all(has_no_dupes(service) for service in root["services"])
61
62 return all(has_no_dupes(service["manifest"])
63 for service in catalog["services"].itervalues())
64
65
46 def main(): 66 def main():
47 parser = argparse.ArgumentParser( 67 parser = argparse.ArgumentParser(
48 description="Generates a Service Manager catalog manifest.") 68 description="Generates a Service Manager catalog manifest.")
49 parser.add_argument("--output") 69 parser.add_argument("--output")
50 parser.add_argument("--packages-dir")
51 parser.add_argument("--pretty", action="store_true") 70 parser.add_argument("--pretty", action="store_true")
52 parser.add_argument("--embedded-services", nargs="+", 71 parser.add_argument("--embedded-services", nargs="+",
53 dest="embedded_services", default=[]) 72 dest="embedded_services", default=[])
54 parser.add_argument("--standalone-services", nargs="+", 73 parser.add_argument("--standalone-services", nargs="+",
55 dest="standalone_services", default=[]) 74 dest="standalone_services", default=[])
56 parser.add_argument("--include-catalogs", nargs="+", dest="included_catalogs", 75 parser.add_argument("--include-catalogs", nargs="+", dest="included_catalogs",
57 default=[]) 76 default=[])
58 parser.add_argument("--override-service-executables", nargs="+", 77 parser.add_argument("--override-service-executables", nargs="+",
59 dest="executable_override_specs", default=[]) 78 dest="executable_override_specs", default=[])
60 args, _ = parser.parse_known_args() 79 args, _ = parser.parse_known_args()
61 80
62 if args.output is None or args.packages_dir is None: 81 if args.output is None:
63 raise Exception("--output and --packages-dir required") 82 raise Exception("--output required")
64 83
65 services = {} 84 services = {}
66 for subcatalog_path in args.included_catalogs: 85 for subcatalog_path in args.included_catalogs:
67 subcatalog = ParseJSONFile(subcatalog_path) 86 subcatalog = ParseJSONFile(subcatalog_path)
68 for name, entry in subcatalog["services"].iteritems(): 87 for name, entry in subcatalog["services"].iteritems():
69 AddServiceEntryToCatalog(services, name, entry) 88 AddServiceEntryToCatalog(services, name, entry)
70 89
71 executable_overrides = {} 90 executable_overrides = {}
72 for override_spec in args.executable_override_specs: 91 for override_spec in args.executable_override_specs:
73 service_name, exe_path = override_spec.split(":", 1) 92 service_name, exe_path = override_spec.split(":", 1)
74 executable_overrides[service_name] = exe_path 93 executable_overrides[service_name] = exe_path
75 94
76 for name in args.embedded_services: 95 for manifest_path in args.embedded_services:
77 manifest_path = os.path.join(args.packages_dir, name, "manifest.json")
78 service_name, manifest = ParseManifest(manifest_path) 96 service_name, manifest = ParseManifest(manifest_path)
79 entry = { "embedded": True, "manifest": manifest } 97 entry = { "embedded": True, "manifest": manifest }
80 AddServiceEntryToCatalog(services, service_name, entry) 98 AddServiceEntryToCatalog(services, service_name, entry)
81 99
82 for name in args.standalone_services: 100 for manifest_path in args.standalone_services:
83 manifest_path = os.path.join(args.packages_dir, name, "manifest.json")
84 service_name, manifest = ParseManifest(manifest_path) 101 service_name, manifest = ParseManifest(manifest_path)
85 entry = { "embedded": False, "manifest": ParseJSONFile(manifest_path) } 102 entry = { "embedded": False, "manifest": manifest }
103 name = manifest["name"]
86 if name in executable_overrides: 104 if name in executable_overrides:
87 entry["executable"] = executable_overrides[name] 105 entry["executable"] = executable_overrides[name]
88 AddServiceEntryToCatalog(services, service_name, entry) 106 AddServiceEntryToCatalog(services, service_name, entry)
89 107
90 catalog = { "services": services } 108 catalog = { "services": services }
91 with open(args.output, 'w') as output_file: 109 with open(args.output, 'w') as output_file:
92 json.dump(catalog, output_file, indent=2 if args.pretty else -1) 110 json.dump(catalog, output_file, indent=2 if args.pretty else -1)
93 111
112 # NOTE: We do the sanity check and possible failure *after* outputting the
113 # catalog manifest so it's easier to inspect erroneous output.
114 SanityCheckCatalog(catalog);
115
94 return 0 116 return 0
95 117
96 if __name__ == "__main__": 118 if __name__ == "__main__":
97 sys.exit(main()) 119 sys.exit(main())
OLDNEW
« no previous file with comments | « services/catalog/public/tools/catalog.gni ('k') | services/catalog/reader.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698