Puppet is a popular declarative framework for specifying and managing complex
system configurations. The Puppet framework includes a domain-specific language
with several advanced features inspired by object-oriented programming,
including user-defined resource types, 'classes' with a form of inheritance,
and dependency management. Like most real-world languages, the language has
evolved in an ad hoc fashion, resulting in a design with numerous features,
some of which are complex, hard to understand, and difficult to use correctly.
We present an operational semantics for μPuppet, a representative subset
of the Puppet language that covers the distinctive features of Puppet, while
excluding features that are either deprecated or work-in-progress. Formalising
the semantics sheds light on difficult parts of the language, identifies
opportunities for future improvements, and provides a foundation for future
analysis or debugging techniques, such as static typechecking or provenance
tracking. Our semantics leads straightforwardly to a reference implementation
in Haskell. We also discuss some of Puppet's idiosyncrasies, particularly its
handling of classes and scope, and present an initial corpus of test cases
supported by our formal semantics.Comment: Full version of ECOOP 2017 conference pape