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()
 |