+1 for standardizing the config file name On Jun 19, 2014 1:01 PM, "Bill Farner" <wfar...@apache.org> wrote:
> I agree with Joe, and tend to disagree with the motivation (for aliases, at > least). The end-result seems to be obfuscation (i'd likely need to peek in > the init file to figure out what a command does, or what command to run), > and i'm doubtful it will result in converting users away from wrapper > scripts. > > I also feel like our configuration files are already very complex (nature > of the beast), and aliases make them even more so. > > I am, however, more comfortable with the standard/assumed config file > naming (i.e. like Vagrantfile). > > > -=Bill > > > On Fri, Jun 13, 2014 at 11:27 AM, Joseph Smith <yasumo...@gmail.com> > wrote: > > > "to set up a configuration file” > > > > This line to me just says “we’re reinventing wrapper scripts” where > > someone could create an “alias” like ./east.sh and ./west.sh to do > deploys > > to various clusters. In that sense, these aliases etc are also “hiding” > bad > > interfaces, just in a different way- and one which isn’t as > > well-tested/understood as shell scripts. > > > > It seems like we’re set on putting time into this, so if we are, then > > ignore me and move onward :). IF we were going to go with an approach, > this > > seems reasonable based on ways that I’ve seen people wrap their > > configs/invocations of the client. > > > > On Jun 12, 2014, at 7:50 AM, Mark Chu-Carroll <mchucarr...@apache.org> > > wrote: > > > > > I'm nothing if not persistent! After feedback from my second try at > > > proposing a way of doing defaults and aliases, I've got a third draft. > > > > > > Feedback please! > > > > > > > > > > > > > > > # Defaults and Shorthands in the Aurora Client > > > > > > ## Motivation > > > > > > Most of the time, users are doing the same thing, over and over again. > > > They're > > > working mainly on one particular service, in one particular workspace. > > But > > > they > > > need to repeat the same parameters, over and over again, and they need > to > > > remember what those parameters are, what order they occur in, what > format > > > they > > > use, and other details that can be difficult to remember. > > > > > > In order to avoid these problems, users set up custom scripts that make > > it > > > easy > > > for them to run commands like "`myservice start`", instead of "`aurora > > job > > > create west/markcc/prod/myserver > > > src/main/aurora/myservice/myservice.aurora`" > > > > > > Scripts aren't necessarily a bad thing. We've designed the aurora > client > > to > > > be script friendly: every command has at least an option supporting > > > easy-to-parse > > > output. But scripts also often cover for problems that really shouldn't > > > exist. > > > > > > Scripts get written for a variety of reasons. Among the many reasons > that > > > people implement > > > scripts, there are scripts that add custom functionality for a specific > > > group of users; > > > scripts that can cover up for inadequate or missing core functionality; > > and > > > there are > > > scripts that cover up for poor user interfaces. > > > > > > In aurora, we've worked hard to eliminate cases where the core > > > functionality of the > > > command-line client is inadequate. But our user interface still needs a > > lot > > > of work. > > > In particular, commands in Aurora often require very long parameters, > > which > > > users have > > > a hard time remembering. Look at the example above - it's a pretty > > typical > > > case. The > > > user wants to create a job. They're going to be creating the same job, > > over > > > and over again. > > > But to run it, they need to type out 68 characters for the two > > parameters! > > > This is a > > > prime example of the kind of case where users will write scripts, not > to > > > provide new/special > > > functionality, nor to cover for inadequate functionality, but just > > because > > > it's so > > > painful to remember and correctly type out an overly long string of > > > parameters. > > > > > > > > > To reduce this, we'd like to support a way for users to set up a > > > configuration > > > file that defines defaults and shorthands for their everyday work. With > > > shorthands, a user that only works with a single service could say > > "aurora > > > job > > > create", instead of needing to spell out the full jobkey and > > configuration > > > file > > > location; a user working with multiple datacenters could say "`aurora > job > > > create @east`" or "`aurora job create @west`" to select the correct > > jobkey. > > > > > > ## Proposal: Aurora Init Files > > > > > > To allow users to customize shorthands, we'll provide a > > > builtin capability to allow users to provide a configuration > > > file, from which their customizations will be loaded. > > > Many applications use a simple pattern to solve similar problems. > > > Vagrant uses a file named "Vagrantfile"; when you run vagrant, if you > > > don't specifically tell the tool where to find a configuration, it > looks > > > in the current directory or one of its parents to find a file named > > > "Vagrantfile". > > > > > > We'd like to follow a similar pattern, and create an "AuroraInit" file. > > > The aurora init file is found by searching the following locations, in > > > order: > > > > > > * the contents of the "--init-file" parameter. > > > * if the "--init-file" parameter is unspecified, then look in the > > current > > > directory for a file named "AuroraInit". > > > * if no "AuroraInit" file exists in the current directory, then look > in > > > the users > > > home directory for an init file named ".aurora/init". > > > > > >> **Sidebar: Why fallback to the users home directory?** > > >> > > >> Codebases are often shared between multiple projects, each of which > > lives > > > in > > >> a set of subdirectories within the codebase. For example, just look at > > > the aurora > > >> sourcecode, which includes the aurora scheduler, the aurora executor, > > > thermos, > > >> and the aurora client. > > >> > > >> If multiple services live in a codebase, then users can't put an > > > AuroraInit file in > > >> the root directory of the codebase, because it would interfere with > > other > > > users' > > >> work. > > >> > > >> The home directory fallback provides an easy way for users to set up a > > > pointer > > >> to the correct init file, which won't be removed by operations like > > > switching branches > > >> in a source repository. Users write shared init files, which are > located > > > in their projects > > >> in the codebase, and create a symbolic link from their project init > file > > > to their home > > >> directory. > > > > > > ### What goes into an init file? > > > > > > We should support the following kinds of things: > > > > > > 1. Universal defaults - user-defined default settings that will be > > > applied to > > > all commands. For example, if there is a default config file that > > > should always > > > be used if the user doesn't specify one, that would be a universal > > > default. > > > 2. Command specific defaults - users should be able to specify that > > they > > > always want > > > to use certain parameter settings for a specific command. For > > example, > > > if they > > > want to always use a default batch size of 10 for updates, but > don't > > > want to affect > > > batch sizes for other commands like kill, they could use a command > > > specific default. > > > 3. Aliases - shorthand names for longer parameters. A user could > > > specify shorthands > > > "east" and "west" for full jobkeys in two different datacenters. > > > > > > > > > ### Defaults > > > > > > A default specifies a set of _bindings_. If a parameter is omitted > > > from a command, and there's a binding for that parameter, it will be > > > automatically inserted into the command as if the user had typed it. > > > The binding is specified in the configuration file using a Python > > > dictionary. > > > > > > For example, if the defaults included `{'jobspec': > > > 'devcluster/me/prod/service'}`, > > > then if you ran `aurora job create` without specifying any parameters, > > the > > > command-line > > > would automatically substitute `devcluster/me/prod/service` for the > > > `jobspec` parameter. > > > > > > Defaults can be declared either globally (in which case they'll be > > inserted > > > as parameters > > > for all commands), or for specific commands (in which case they'll only > > be > > > inserted for a > > > single command). > > > > > > > > > ### Aliases > > > > > > An alias is a short equivalent for a parameter. When a command line is > > > provided by a user, aliases will be expanded inline. A user can > > > specifically > > > mark an alias for expansion by prefixing it with "@"; if an alias > > > appears on the command-line surrounded by whitespace, it will be > > > replaced even if it isn't marked with an "@". > > > > > >> **Sidebar: why not just use shell substitutions?** > > >> > > >> The @-substitution model proposed here is very similar to unix > variable > > >> substitution. So why implement the same thing all over again? Why not > > > just tell > > >> users to use their shell? > > >> > > >> There are several reasons. > > >> > > >> 1. All of the options and aliases that affect aurora command > invocations > > > can be specified > > >> in one place: the AuroraInit file. > > >> 2. Command shell substitution is complex - the ways in which the > command > > > shell does > > >> expansion, tokenization, substitution, and parsing can be very hard > to > > > follow. Adding > > >> the aurora aliases to that process just adds another layer of > confusion > > > to the process. > > >> With internal alias substitution, we can avoid the confusions of > > > expansions and > > >> tokenization for aurora aliases. > > >> 3. We can provide better debugging and error messages with our own > alias > > > substitution. > > >> For example, if a user specifies a job using aliases like "`aurora > job > > > create @c/@me/test/myservice`", > > >> we can create an error message that shows exactly what they typed, > and > > > how it expanded: > > >> <pre> > > >> Job "west/markcc/test/myservice" not found in configuration file > > > config.aurora. > > >> Jobkey was generated by alias expansion: original key was > > > "@c/@me/test/myservice", where: > > >> - "@c" was expanded to "west" > > >> - "@me" was expanded to "markcc" > > >> config_file parameter "config.aurora" was specified from defaults. > > >> </pre> > > > > > > > > > ### Defining Shorthands and Defaults: Syntax and Examples > > > > > > The init file is, like aurora job configurations, a python source file > > > using a Pystachio > > > schema. The schema is loaded, and an `Init` object is retrieved from > the > > > top-level > > > variable `init` in that file. > > > > > > The pystachio schema for init files is: > > > > > > class CommandDefaults(Struct) > > > command = Required(String) > > > defaults=Map(String, String) > > > > > > class Init(Struct): > > > defaults=Map(String, String) > > > command_defaults = Optional(CommandDefaults) > > > aliases=Map(String, String) > > > > > > > > > For example, an init file could contain the following: > > > > > > init=Init( > > > defaults={ > > > "jobspec": "west/markcc/test/myservice", > > > "config_file": "./src/aurora/myservice.aurora" > > > }, > > > aliases={ > > > "east": "east/markcc/test/myservice", > > > "c": "east", > > > "me": "markchucarroll" > > > }, > > > command_defaults(command="job update", > > > defaults={"--batch-size": 10} > > > )) > > > > > > > > > With this configuration file, if the user ran "`aurora job create`" > > without > > > any parameters, > > > it would automatically be expanded to "`aurora job create > > > west/markcc/test/myservice ./src/aurora/myservice.aurora`". > > > > > > If a user ran "`aurora job create east`", the alias `east` would be > > > expanded to "east/markcc/test/myservice", and the missing config file > > > parameter would > > > be instantiated using the default, to create a command-line: > > > "`aurora job create east/markcc/test/myservice > > > ./src/aurora/myservice.aurora`". > > > > > > If a user ran "`aurora job create @c/@me/test/myservice`", the two > > aliases > > > would > > > be expanded, and the omitted configuration parameter would be added: > > > "`aurora job create east/markchucarroll/test/myservice > > > ./src/aurora/myservice.aurora`". > > > > > > If a user ran "`aurora job update`", then the `jobspec` and > `config_file` > > > parameters would > > > get inserted from the global defaults, and the "--batch-size=10" would > be > > > inserted from > > > the command defaults for "aurora job update". > > > > >