autorequire: - objects defined in type manifests should be automatically prerequisites of the current object - __foo/some-id __other other-id --state present => require="__other/other-id" __foo/some-id metaparameters: - steal the metaparameters from puppet: # I have to be there before the other one __directory /etc/ssh \ --before __file/etc/ssh/sshd_config # the other one has to be there before me __file /etc/ssh/sshd_config \ --after __directory/etc/ssh # if I change, tell the other one about it __file /etc/ssh/sshd_config \ --notify __init_script/etc/rc.d/sshd # whenever the other one changes, I want to know __init_script /etc/rc.d/sshd \ --subscribe __file/etc/ssh/sshd_config - how does a type react to a received 'event'? - maybe something like: __some_type/ manifest ... gencode-refresh ... - gencode-refresh -> code-refresh -> ssh $target sh -e code-refresh logging: - logging from type emulator without clobbering stdout maybe implement logging server as described here [1] [1] http://docs.python.org/py3k/howto/logging-cookbook.html#configuration-server-example - use different logger to limit output to current area of interest, e.g. explorer.$target_host: explorer related messages for the run for $target_host manifest.$target_host: manifest related messages for the run for $target_host ... then one could filter e.g. on explorer.* - more granular debug output, [2] http://blog.ooz.ie/2011/03/python-logging-extending-standard.html tests: __init__(): - sets up env: __target_host run_initial_manifest(): - parameter is actually used (from __init__) - ensure changing the manifest actually runs a different manifest -> give ConfigInstall Constructor different manifest -> different manifest is executed. - test all submitted (from core to type manifest) variables: - ENVIRONMENT - they are set - they contain the correct values run_type_manifest(): - test all submitted (from core to type manifest) variables: - ENVIRONMENT - they are set - they contain the correct values - same tests as for test_initial_manifest_*? run_manifest(): - test all submitted variables: - ENVIRONMENT - including __debug, if debug - they are set - they contain the correct values - does $require work? - check that exception raised, if manifest is not existent object_run(): - ensure no object is run twice - ensure requirements are taken into account? - and order of run is adjusted - check (from extern?) that all needed variables are setup - ensure no code-{local, remote} is created, if gencode is not producing code - ensure THAT code-{local, remote} contains what gencode created - abort if gencode-* fails - abort if code-* fails - abort == raise(FooException) - gencode-*: ensure ENVIRONMENT is setup correctly run_type_explorer() - ensure ALL type explores have been run - ensure output is saved to correct path - ensure a type with {0,1,2} explorers works ? - none, one, multiple - ensure ENVIRONMENT is setup correctly - fails if ANY of the given explorer fails run_global_explorers(): - ensure ALL type explores have been run - ensure output is saved to correct path - ensure a type with {0,1,2} explorers works ? - none, one, multiple - ensure ENVIRONMENT is setup correctly - fails if ANY of the given explorer fails Code fixes needed: - shutil, os.mkdir, etc. everywhere: catch/reraise exceptions correctly