mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
- Adds precache generator for all verbs in grammar - ignore precache.py Signed-off-by: Rohit Yadav <bhaisaab@apache.org>
93 lines
3.7 KiB
Python
93 lines
3.7 KiB
Python
# Licensed to the Apache Software Foundation (ASF) under one
|
|
# or more contributor license agreements. See the NOTICE file
|
|
# distributed with this work for additional information
|
|
# regarding copyright ownership. The ASF licenses this file
|
|
# to you under the Apache License, Version 2.0 (the
|
|
# "License"); you may not use this file except in compliance
|
|
# with the License. You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing,
|
|
# software distributed under the License is distributed on an
|
|
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
# KIND, either express or implied. See the License for the
|
|
# specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
try:
|
|
from common import grammar
|
|
from marvin.cloudstackAPI import *
|
|
from marvin import cloudstackAPI
|
|
except ImportError, e:
|
|
pass
|
|
|
|
completions = cloudstackAPI.__all__
|
|
|
|
|
|
def get_api_module(api_name, api_class_strs=[]):
|
|
try:
|
|
api_mod = __import__("marvin.cloudstackAPI.%s" % api_name,
|
|
globals(), locals(), api_class_strs, -1)
|
|
except ImportError, e:
|
|
print "Error: API not found", e
|
|
return None
|
|
return api_mod
|
|
|
|
|
|
def main():
|
|
"""
|
|
cachegen.py creates a precached dictionary for all the available verbs in
|
|
the predefined grammar of cloudmonkey, it dumps the dictionary in an
|
|
importable python module. This way we cheat on the runtime overhead of
|
|
completing commands and help docs. This reduces the overall search and
|
|
cache_miss (computation) complexity from O(n) to O(1) for any valid cmd.
|
|
"""
|
|
# datastructure {'verb': {cmd': ['api', [params], doc, required=[]]}}
|
|
cache_verbs = {}
|
|
for verb in grammar:
|
|
completions_found = filter(lambda x: x.startswith(verb), completions)
|
|
cache_verbs[verb] = {}
|
|
for api_name in completions_found:
|
|
api_cmd_str = "%sCmd" % api_name
|
|
api_mod = get_api_module(api_name, [api_cmd_str])
|
|
if api_mod is None:
|
|
continue
|
|
try:
|
|
api_cmd = getattr(api_mod, api_cmd_str)()
|
|
required = api_cmd.required
|
|
doc = api_mod.__doc__
|
|
except AttributeError, e:
|
|
print "Error: API attribute %s not found!" % e
|
|
params = filter(lambda x: '__' not in x and 'required' not in x,
|
|
dir(api_cmd))
|
|
if len(required) > 0:
|
|
doc += "\nRequired args: %s" % " ".join(required)
|
|
doc += "\nArgs: %s" % " ".join(params)
|
|
api_name_lower = api_name.replace(verb, '').lower()
|
|
cache_verbs[verb][api_name_lower] = [api_name, params, doc,
|
|
required]
|
|
f = open("precache.py", "w")
|
|
f.write("""# Auto-generated code by cachegen.py
|
|
# Licensed to the Apache Software Foundation (ASF) under one
|
|
# or more contributor license agreements. See the NOTICE file
|
|
# distributed with this work for additional information
|
|
# regarding copyright ownership. The ASF licenses this file
|
|
# to you under the Apache License, Version 2.0 (the
|
|
# "License"); you may not use this file except in compliance
|
|
# with the License. You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing,
|
|
# software distributed under the License is distributed on an
|
|
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
# KIND, either express or implied. See the License for the
|
|
# specific language governing permissions and limitations
|
|
# under the License.""")
|
|
f.write("\nprecached_verbs = %s" % cache_verbs)
|
|
f.close()
|
|
|
|
if __name__ == "__main__":
|
|
main()
|