That's what I thought - but in pants/blaze/maven/..., I thought most people normally left their command-line in the project root. I certainly do. If you're doing that - and a lot of people do - then you can't easily disambiguate between different services living in the same repos.
-Mark On Thu, Jun 19, 2014 at 4:40 PM, Bill Farner <wfar...@apache.org> wrote: > On Thu, Jun 19, 2014 at 1:36 PM, Mark Chu-Carroll <mchucarr...@apache.org> > wrote: > > > Maybe I'm misunderstanding you? > > > > Where else should you look for a default configuration file, where it can > > automatically differentiate between different services stored in the same > > repository? > > > > Working directory would be most intuitive to me. > > > > > > -Mark > > > > > > On Thu, Jun 19, 2014 at 4:35 PM, Bill Farner <wfar...@apache.org> wrote: > > > > > > in the root of the project directory > > > > > > FWIW i don't see any particular reason why it needs to be in the root > of > > a > > > repo/project dir. > > > > > > -=Bill > > > > > > > > > On Thu, Jun 19, 2014 at 1:31 PM, Mark Chu-Carroll < > > mchucarr...@apache.org> > > > wrote: > > > > > > > I actually don't agree with standardizing the config file name. > > > > > > > > Here's the issue: if you're working with typical modern tools - > gradle, > > > > maven, pants, sbt, ..., you're doing your work in the root of a > fairly > > > deep > > > > source hierarchy. Living in that hierarchy, there are likely multiple > > > > aurora job definitions. > > > > > > > > There's no way of just picking a default config file name that's not > > > going > > > > to cause confusion and disruption, because the config file sitting in > > the > > > > root of the project directory is going to be wrong for many users. > > > > > > > > That was the point of the home-directory fallback thing; it provided > > > users > > > > with a way to define a default config file from outside of the > > workspace, > > > > so that different users could set it differently. > > > > > > > > In any case: I'm punting on this for now. It doesn't seem like > there's > > > > anything close to a consensus that this is worth doing, so I'm going > to > > > > shelve it, and we can come back to it if the consensus changes later. > > > > > > > > -Mark > > > > > > > > > > > > > > > > > > > > On Thu, Jun 19, 2014 at 4:08 PM, James Oliver <jdo...@gmail.com> > > wrote: > > > > > > > > > +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". > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >