Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • faproietti/ar2018
  • chierici/ar2018
  • SDDS/ar2018
  • cnaf/annual-report/ar2018
4 results
Show changes
Showing
with 4364 additions and 0 deletions
contributions/sd_iam/request-cert.png

186 KiB

@misc{rfc5280,
series = {Request for Comments},
number = 5280,
howpublished = {RFC 5280},
publisher = {RFC Editor},
doi = {10.17487/RFC5280},
url = {https://rfc-editor.org/rfc/rfc5280.txt},
author = {Sharon Boeyen and Stefan Santesson and Tim Polk and Russ Housley and Stephen Farrell and Dave Cooper},
title = {{Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile}},
pagetotal = 151,
year = 2008,
month = may,
abstract = {This memo profiles the X.509 v3 certificate and X.509 v2 certificate revocation list (CRL) for use in the Internet. An overview of this approach and model is provided as an introduction. The X.509 v3 certificate format is described in detail, with additional information regarding the format and semantics of Internet name forms. Standard certificate extensions are described and two Internet-specific extensions are defined. A set of required certificate extensions is specified. The X.509 v2 CRL format is described in detail along with standard and Internet-specific extensions. An algorithm for X.509 certification path validation is described. An ASN.1 module and examples are provided in the appendices. {[}STANDARDS-TRACK{]}},
}
@misc{rfc3820,
series = {Request for Comments},
number = 3820,
howpublished = {RFC 3820},
publisher = {RFC Editor},
doi = {10.17487/RFC3820},
url = {https://rfc-editor.org/rfc/rfc3820.txt},
author = {Von Welch and Mary Thompson and Douglas E. Engert and Steven Tuecke and Laura Pearlman},
title = {{Internet X.509 Public Key Infrastructure (PKI) Proxy Certificate Profile}},
pagetotal = 37,
year = 2004,
month = jun,
abstract = {This document forms a certificate profile for Proxy Certificates, based on X.509 Public Key Infrastructure (PKI) certificates as defined in RFC 3280, for use in the Internet. The term Proxy Certificate is used to describe a certificate that is derived from, and signed by, a normal X.509 Public Key End Entity Certificate or by another Proxy Certificate for the purpose of providing restricted proxying and delegation within a PKI based authentication system. {[}STANDARDS-TRACK{]}},
}
@misc{rfc5755,
series = {Request for Comments},
number = 5755,
howpublished = {RFC 5755},
publisher = {RFC Editor},
doi = {10.17487/RFC5755},
url = {https://rfc-editor.org/rfc/rfc5755.txt},
author = {Sean Turner and Stephen Farrell and Russ Housley},
title = {{An Internet Attribute Certificate Profile for Authorization}},
pagetotal = 50,
year = 2010,
month = jan,
abstract = {This specification defines a profile for the use of X.509 Attribute Certificates in Internet Protocols. Attribute certificates may be used in a wide range of applications and environments covering a broad spectrum of interoperability goals and a broader spectrum of operational and assurance requirements. The goal of this document is to establish a common baseline for generic applications requiring broad interoperability as well as limited special purpose requirements. The profile places emphasis on attribute certificate support for Internet electronic mail, IPsec, and WWW security applications. This document obsoletes RFC 3281. {[}STANDARDS-TRACK{]}},
}
@misc{nginxvoms-cnafar-2016,
author = {Paulon, S and Giacomini, F and Ceccanti, A},
title = {{A VOMS module for the NGINX web server}},
howpublished = {{INFN-CNAF Annual Report}},
year = 2016,
url = {https://www.cnaf.infn.it/annual-report},
}
@InProceedings{voms,
author="Alfieri, R.
and Cecchini, R.
and Ciaschini, V.
and dell'Agnello, L.
and Frohner, {\'A}.
and Gianoli, A.
and L{\~o}rentey, K.
and Spataro, F.",
editor="Fern{\'a}ndez Rivera, Francisco
and Bubak, Marian
and G{\'o}mez Tato, Andr{\'e}s
and Doallo, Ram{\'o}n",
title="VOMS, an Authorization System for Virtual Organizations",
booktitle="Grid Computing",
year=2004,
publisher="Springer Berlin Heidelberg",
address="Berlin, Heidelberg",
pages="33--40",
abstract="We briefly describe the authorization requirements, focusing on the framework of the DataGrid and DataTAG Projects and illustrate the architecture of a new service we have developed, the Virtual Organization Membership Service (VOMS), to manage authorization information in Virtual Organization scope.",
isbn="978-3-540-24689-3"
}
@Misc{module-baltig,
title = {\verb"ngx_http_voms_module"},
note = {\url{https://baltig.infn.it/storm2/ngx\_http\_voms\_module}}}
@Misc{nginx,
title = {Nginx},
note = {\url{https://nginx.org/}}
}
@Misc{openresty,
title = {{OpenResty}},
note = {\url{https://openresty.org/}}}
@Misc{test::nginx,
title = {{Test::Nginx}},
note = {\url{https://metacpan.org/pod/Test::Nginx}}}
@Misc{voms-github,
title = {{VOMS}},
note = {\url{https://github.com/italiangrid/voms}}}
@Misc{openssl,
title = {{OpenSSL}},
note = {\url{https://www.openssl.org/}}}
contributions/sd_nginx_voms/deployment.png

96.7 KiB

\documentclass[a4paper]{jpconf}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{graphicx}
\bibliographystyle{iopart-num}
\begin{document}
\title{A VOMS module for the Nginx web server}
\author{A. Ceccanti$^1$, F. Giacomini$^1$, E. Ronchieri$^1$, N. Terranova$^1$}
\address{$^1$ INFN-CNAF, Bologna, IT}
\ead{francesco.giacomini@cnaf.infn.it}
\begin{abstract} We present the motivation, the design and some
implementation hints of a software module for the Nginx web server
aimed at extracting the attributes of a VOMS-issued Attribute
Certificate during a client authentication based on an X.509 Proxy
Certificate. The module enables the use of Nginx as a reverse proxy
to a Grid service, relieving it from most of the work necessary to
authenticate a client.
\end{abstract}
\section{Introduction}
Every Grid service needs to authenticate and possibly authorize every
request that it receives. The authentication is historically based on
X.509 Proxy Certificates~\cite{rfc5280}, extended with Attribute
Certificates~\cite{rfc5755} obtained from a VOMS
service~\cite{voms}. An Attribute Certificate is conceptually an
assertion signed by the VOMS service that declares the groups the user
submitting the request belongs to within a Virtual Organization
(e.g. a scientific collaboration) and the possible roles they have
within those groups.
As a consequence, a Grid service must carry out a number of
security-related steps before even starting its own business logic:
\begin{itemize}
\item offer an HTTPS endpoint;
\item perform X.509 certificate-based client authentication;
\item extract the VOMS attributes, on which it could later base an
authorization decision.
\end{itemize}
The purpose of this work is to factor those three actions out of a
Grid service into a common service-independent module to be run by a
reverse proxy deployed in front of the service. The ideal deployment
model is shown in Figure~\ref{fig:deployment}. If the reverse proxy
and the actual service run in a trusted zone, the communication
between the two can even happen over plain HTTP.
\begin{figure}
\begin{center}
\includegraphics[width=.9\textwidth]{deployment}
\caption{\label{fig:deployment}Deployment model enabled by the
VOMS module run in a front-end service acting as a reverse proxy
towards the actual service running as the back-end.}
\end{center}
\end{figure}
After a first prototype~\cite{nginxvoms-cnafar-2016} was prepared as
part of a master thesis, a properly engineered version has been
developed for production use.
\section{Nginx}
The reverse proxy of choice is Nginx~\cite{nginx}. Nginx is an efficient HTTP and
reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy
server, which serves or proxies a large fraction of the busiest
sites on the Internet.
Nginx has a modular architecture: the core software components provide
a solid and efficient foundation to dispatch events (e.g. from
networking) to one or more worker processes to be asynchronously
managed. Additional functionality is further provided by
\textit{modules} that are linked to the Nginx executable. Modules can
also be loaded dynamically at run time, yet they need to be known at
compile time. As a consequence, the typical way to obtain an Nginx
executable is to compile the corresponding source code, specifying the
exact selection of modules needed for the specific deployment.
To simplify our build and testing setup, we have opted to base our
work on top of the OpenResty~\cite{openresty} distribution of Nginx,
which includes already a selection of useful modules.
However we cannot use the Nginx code as-is, for it is unaware of the
delegation mechanism designed by Globus for the Grid Security
Infrastructure on which all Grid services are based. The delegation
mechanism introduces a control character in the HTTP protocol, between
the SSL/TLS handshake and the transmission of the method. Although we
do not intend to support the delegation mechanism in this work, we
wrote a minimal patch to the Nginx request-parsing code, so that it
can accept that extra character and ignore it if it means ``no
delegation''.
An additional patch has been proposed for Nginx upstream, to enable
the support for proxy certificates via a flag in the configuration
file, after recent versions of OpenSSL~\cite{openssl} have removed the
possibility to enable it via an environment variable. Since proxy
certificates are not widely used outside of the Grid world, the patch
has not been accepted; despite being a more convenient and clearer
solution, the patch is not even applied locally, since there is a
workaround applicable directly in our module's code, as described
below.
An instance of Nginx can be configured (and re-configured) through a
file read by the master process. The configuration file can specify,
among many other things, that Nginx runs in reverse-proxy mode and how
the request should be passed to the upstream server (i.e. the
back-end). The syntax of the configuration file allows for the use of
\textit{variables} (in our case, for example, there would be one
called \texttt{\$voms\_fqans}), whose value is provided by a specific
handler that gets executed when the corresponding variable is used.
\section{Building and testing}
Though the development can happen on any platform, the reference
platform for the deployment at the moment is CentOS 7. Moreover, as
mentioned above, we have elected the OpenResty distribution as the
basis for our own Nginx module. A Docker image combining CentOs 7 and
OpenResty is available both for local builds and for the continuous
integration builds bound to the \textit{git} repository that hosts the
source code.
The Docker image is augmented with the necessary dependencies (such as
the VOMS libraries) and with the elected development tools, mostly
installed through the software collections \textit{Developer Toolset
7} (to have a compiler that supports C++ 2017 and various
sanitizers) and \textit{LLVM Toolset 7} (to have the code formatter
and the static analyzer).
The testing is based on \texttt{Test::Nginx}~\cite{test::nginx}, a
Perl-based testing framework that comes with OpenResty, that allows
the specification of tests with a declarative syntax. We struggled to
find a way to enable TLS client authentication, but the result is very
satisfactory.
The build and the tests are automatically run every time some code is
pushed to the reference git repository~\cite{module-baltig}.
\section{The VOMS module}
The purpose of the VOMS module is to extract the information available
in the Attribute Certificate embedded in the X.509 Proxy Certificate
used for the authentication of the client and make it available as
Nginx variables. The variables can then be used in the configuration
file to form the request that is passed upstream by the reverse proxy.
The variables correspond very closely to the fields of the
\texttt{voms} data structure found in the API of the VOMS C++
library~\cite{voms-github}. For example:
\begin{description}
\item[\texttt{voms\_user}] The Subject of the End-Entity certificate, used to sign the proxy.
\item[\texttt{voms\_fqans}] A comma-separated list of Fully Qualified Attribute
Names.
\item[\texttt{voms\_vo}] The name of the Virtual Organization (VO) to which the End Entity belongs.
\item[\texttt{voms\_not\_before}] The date before which the Attribute
Certificate is not yet valid.
\item[\texttt{voms\_not\_after}] The date after which the Attribute Certificate
is not valid anymore.
\end{description}
The module consists mainly of the handlers that are called when a
variable is referenced in the configuration file. The information
needed to give a value to the variables comes from invocations of the
VOMS library API; that information is obtained as a by-product of the
validation of the X.509 certificate chain presented by the client,
including the VOMS Attribute Certificate. Since such a validation is
expensive, performing it every time a handler is called is best
avoided and a caching strategy is preferable. The caching can be
applied at multiple levels: for each request, for each connection
(multiple requests can be sent over the same connection), for multiple
connections authenticated with the same client proxy certificate. At
the moment the caching is applied at connection level, but moving it
to the next level is already planned.
As mentioned above, the module also enables the support for proxy
certificates in OpenSSL, which in recent versions of the library is
not available any more through setting an environment variable. This
is done calling the appropriate OpenSSL API functions in a handler
that gets executed at the end of the Nginx configuration phase, at a
time when the SSL certificate store, the data structure containing the
flag that enables the acceptance of proxies, is initialized and
available for manipulation.
\section{Deployment}
Once the module described in this work is linked to the Nginx
executable, in order to deploy a Grid service according to the model
sketched in the Introduction, the typical configuration for an Nginx
instance used as a reverse proxy in front of the actual Grid service
would include directives similar to the following.
{\small
\begin{verbatim}
server {
listen 443 ssl;
ssl_certificate /certs/cert.pem;
ssl_certificate_key /certs/key.pem;
ssl_client_certificate /etc/pki/tls/certs/ca-bundle.crt;
ssl_verify_client on;
ssl_verify_depth 100;
location / {
proxy_set_header Voms-User $voms_user;
proxy_set_header Voms-Fqans $voms_fqans;
proxy_set_header Voms-Vo $voms_vo;
proxy_set_header Voms-Not-Before $voms_not_before;
proxy_set_header Voms-Not-After $voms_not_after;
proxy_pass http://back-end;
}
}
\end{verbatim}
}
The service running on the back-end would then receive requests over
plain HTTP and will find among its headers all the VOMS information
needed to apply its own authorization policies.
\section{Conclusions and future work}
In this paper we have shown how an Nginx reverse proxy equipped with
the described module could relieve a Grid service from most of the
work necessary to authenticate a client presenting credentials based
on X.509 Proxy Certificates extended with a VOMS-issued Attribute
Certificate.
The module is ready for production use and is currently part of the
development effort aimed at revising the implementation of the StoRM
service.
The main planned development concerns the improvement of the caching
of the information obtained during the validation of VOMS Attribute
Certificates.
\section*{References}
\bibliography{biblio}
\end{document}
@techreport{jwt,
author = {Michael B. Jones and John Bradley and Nat Sakimura},
title = {{The JSON Web Token RFC}},
type = {RFC},
number = 7519,
year = {2015},
month = {May},
issn = {2070-1721},
publisher = {IETF Tools},
institution = {IETF Tools},
url = {https://tools.ietf.org/rfc/rfc7519.txt}
}
@techreport{oauth,
author = {Dick Hardt},
title = {{The OAuth 2.0 Authorization Framework}},
type = {RFC},
number = 6749,
year = {2012},
month = {October},
issn = {2070-1721},
publisher = {IETF Tools},
institution = {IETF Tools},
url = {https://tools.ietf.org/rfc/rfc6749.txt}
}
@techreport{oauth-token-exchange,
author = {Michael B. Jones and Anthony Nadalin and Brian Campbell
and John Bradley and Chuck Mortimore},
title = {{OAuth 2.0 Token Exchange}},
type = {Internet-Draft},
number = "draft-ietf-oauth-token-exchange-16.txt",
year = {2019},
month = {April},
day = {22},
institution = {IETF Tools},
url = {https://tools.ietf.org/id/draft-ietf-oauth-token-exchange-16.txt}
}
@techreport{oauth-metadata,
author = {Michael B. Jones and Nat Sakimura and John Bradley},
title = {{OAuth 2.0 Authorization Server Metadata}},
type = {RFC},
number = 8414,
year = {2018},
month = {June},
issn = {2070-1721},
publisher = {IETF Tools},
institution = {IETF Tools},
url = {https://tools.ietf.org/rfc/rfc8414.txt}
}
@online{oidc,
author = {{OpenID Foundation}},
title = {{The OpenID Connect identity layer}},
year = 2018,
url = {https://openid.net/connect/},
urldate = {2018-12-03}
}
@online{oidc-discovery,
author = {{Nat Sakimura and John Bradley and Michael B. Jones and Edmund Jay}},
title = {{The OpenID Connect discovery specification}},
year = 2014,
url = {https://openid.net/specs/openid-connect-discovery-1_0.html},
urldate = {2018-12-03}
}
@online{igtf,
title = {{The Interoperable Global Trust Federation}},
url = {https://www.igtf.net/},
urldate = {2018-12-03}
}
@online{x509,
title = {{X.509}},
url = {https://en.wikipedia.org/wiki/X.509},
urldate = {2018-12-03}
}
@article{GSI,
author = {Von Welch and
Frank Siebenlist and
Ian T. Foster and
John Bresnahan and
Karl Czajkowski and
Jarek Gawor and
Carl Kesselman and
Sam Meder and
Laura Pearlman and
Steven Tuecke},
title = {Security for Grid Services},
journal = {CoRR},
volume = {cs.CR/0306129},
year = {2003},
url = {http://arxiv.org/abs/cs.CR/0306129},
timestamp = {Mon, 13 Aug 2018 16:49:07 +0200},
biburl = {https://dblp.org/rec/bib/journals/corr/cs-CR-0306129},
bibsource = {dblp computer science bibliography, https://dblp.org}
}
@software{VOMS,
author = {Vincenzo Ciaschini and Valerio Venturi and Andrea Ceccanti},
title = {{The Virtual Organisation Membership Service}},
doi = {10.5281/zenodo.1875371},
url = {https://doi.org/10.5281/zenodo.1875371}
}
@online{edugain,
title = {{eduGAIN interfederation website}},
url = {http://www.geant.org/Services/Trust_identity_and_security/eduGAIN},
urldate = {2018-12-03}
}
@online{google,
title = {{The Google Identity Platform}},
url = {https://developers.google.com/identity/},
urldate = {2018-12-03}
}
@online{scim,
title = {{The System for Cross Domain Identity Management website}},
url = {http://www.simplecloud.info/},
urldate = {2018-12-03}
}
@article{indigo-aai-chep2016,
author={Andrea Ceccanti and Marcus Hardt and Bas Wegh and A. Paul Millar
and Marco Caberletti and Enrico Vianello and Slavek Licehammer},
title={{The INDIGO-Datacloud Authentication and Authorization Infrastructure}},
journal={Journal of Physics: Conference Series},
volume={898},
number={10},
pages={102016},
url={http://iopscience.iop.org/article/10.1088/1742-6596/898/10/102016},
year={2017}
}
@software{iam,
author = {Andrea Ceccanti and Enrico Vianello and Marco Caberletti},
title = {{INDIGO Identity and Access Management (IAM)}},
doi = {10.5281/zenodo.1874790},
url = {https://doi.org/10.5281/zenodo.1874790}
}
@software{voms-admin,
author = {Andrea Ceccanti},
title = {{The VOMS administration service}},
doi = {10.5281/zenodo.1875616},
url = {https://doi.org/10.5281/zenodo.1875616}
}
@misc{cwp,
Author = {{HEP Software Foundation} and Johannes Albrecht and Antonio
Augusto {Alves} Jr and Guilherme Amadio and Giuseppe Andronico and Nguyen
Anh-Ky and Laurent Aphecetche and John Apostolakis and Makoto Asai and Luca
Atzori and Marian Babik and Giuseppe Bagliesi and Marilena Bandieramonte
and Sunanda Banerjee and Martin Barisits and Lothar A. T. Bauerdick and
Stefano Belforte and Douglas Benjamin and Catrin Bernius and Wahid Bhimji
and Riccardo Maria Bianchi and Ian Bird and Catherine Biscarat and Jakob
Blomer and Kenneth Bloom and Tommaso Boccali and Brian Bockelman and Tomasz
Bold and Daniele Bonacorsi and Antonio Boveia and Concezio Bozzi and Marko
Bracko and David Britton and Andy Buckley and Predrag Buncic and Paolo
Calafiura and Simone Campana and Philippe Canal and Luca Canali and
Gianpaolo Carlino and Nuno Castro and Marco Cattaneo and Gianluca Cerminara
and Javier Cervantes Villanueva and Philip Chang and John Chapman and Gang
Chen and Taylor Childers and Peter Clarke and Marco Clemencic and Eric
Cogneras and Jeremy Coles and Ian Collier and David Colling and Gloria
Corti and Gabriele Cosmo and Davide Costanzo and Ben Couturier and Kyle
Cranmer and Jack Cranshaw and Leonardo Cristella and David Crooks and
Sabine Crépé-Renaudin and Robert Currie and Sünje Dallmeier-Tiessen and
Kaushik De and Michel De Cian and Albert De Roeck and Antonio Delgado Peris
and Frédéric Derue and Alessandro Di Girolamo and Salvatore Di Guida and
Gancho Dimitrov and Caterina Doglioni and Andrea Dotti and Dirk Duellmann
and Laurent Duflot and Dave Dykstra and Katarzyna Dziedziniewicz-Wojcik and
Agnieszka Dziurda and Ulrik Egede and Peter Elmer and Johannes Elmsheuser
and V. Daniel Elvira and Giulio Eulisse and Steven Farrell and Torben
Ferber and Andrej Filipcic and Ian Fisk and Conor Fitzpatrick and José Flix
and Andrea Formica and Alessandra Forti and Giovanni Franzoni and James
Frost and Stu Fuess and Frank Gaede and Gerardo Ganis and Robert Gardner
and Vincent Garonne and Andreas Gellrich and Krzysztof Genser and Simon
George and Frank Geurts and Andrei Gheata and Mihaela Gheata and Francesco
Giacomini and Stefano Giagu and Manuel Giffels and Douglas Gingrich and
Maria Girone and Vladimir V. Gligorov and Ivan Glushkov and Wesley Gohn and
Jose Benito Gonzalez Lopez and Isidro González Caballero and Juan R.
González Fernández and Giacomo Govi and Claudio Grandi and Hadrien Grasland
and Heather Gray and Lucia Grillo and Wen Guan and Oliver Gutsche and
Vardan Gyurjyan and Andrew Hanushevsky and Farah Hariri and Thomas Hartmann
and John Harvey and Thomas Hauth and Benedikt Hegner and Beate Heinemann
and Lukas Heinrich and Andreas Heiss and José M. Hernández and Michael
Hildreth and Mark Hodgkinson and Stefan Hoeche and Burt Holzman and Peter
Hristov and Xingtao Huang and Vladimir N. Ivanchenko and Todor Ivanov and
Jan Iven and Brij Jashal and Bodhitha Jayatilaka and Roger Jones and Michel
Jouvin and Soon Yung Jun and Michael Kagan and Charles William Kalderon and
Meghan Kane and Edward Karavakis and Daniel S. Katz and Dorian Kcira and
Oliver Keeble and Borut Paul Kersevan and Michael Kirby and Alexei
Klimentov and Markus Klute and Ilya Komarov and Dmitri Konstantinov and
Patrick Koppenburg and Jim Kowalkowski and Luke Kreczko and Thomas Kuhr and
Robert Kutschke and Valentin Kuznetsov and Walter Lampl and Eric Lancon and
David Lange and Mario Lassnig and Paul Laycock and Charles Leggett and
James Letts and Birgit Lewendel and Teng Li and Guilherme Lima and Jacob
Linacre and Tomas Linden and Miron Livny and Giuseppe Lo Presti and
Sebastian Lopienski and Peter Love and Adam Lyon and Nicolò Magini and
Zachary L. Marshall and Edoardo Martelli and Stewart Martin-Haugh and Pere
Mato and Kajari Mazumdar and Thomas McCauley and Josh McFayden and Shawn
McKee and Andrew McNab and Rashid Mehdiyev and Helge Meinhard and Dario
Menasce and Patricia Mendez Lorenzo and Alaettin Serhan Mete and Michele
Michelotto and Jovan Mitrevski and Lorenzo Moneta and Ben Morgan and
Richard Mount and Edward Moyse and Sean Murray and Armin Nairz and Mark S.
Neubauer and Andrew Norman and Sérgio Novaes and Mihaly Novak and Arantza
Oyanguren and Nurcan Ozturk and Andres Pacheco Pages and Michela Paganini
and Jerome Pansanel and Vincent R. Pascuzzi and Glenn Patrick and Alex
Pearce and Ben Pearson and Kevin Pedro and Gabriel Perdue and Antonio
Perez-Calero Yzquierdo and Luca Perrozzi and Troels Petersen and Marko
Petric and Andreas Petzold and Jónatan Piedra and Leo Piilonen and Danilo
Piparo and Jim Pivarski and Witold Pokorski and Francesco Polci and Karolos
Potamianos and Fernanda Psihas and Albert Puig Navarro and Günter Quast and
Gerhard Raven and Jürgen Reuter and Alberto Ribon and Lorenzo Rinaldi and
Martin Ritter and James Robinson and Eduardo Rodrigues and Stefan Roiser
and David Rousseau and Gareth Roy and Grigori Rybkine and Andre Sailer and
Tai Sakuma and Renato Santana and Andrea Sartirana and Heidi Schellman and
Jaroslava Schovancová and Steven Schramm and Markus Schulz and Andrea
Sciabà and Sally Seidel and Sezen Sekmen and Cedric Serfon and Horst
Severini and Elizabeth Sexton-Kennedy and Michael Seymour and Davide
Sgalaberna and Illya Shapoval and Jamie Shiers and Jing-Ge Shiu and Hannah
Short and Gian Piero Siroli and Sam Skipsey and Tim Smith and Scott Snyder
and Michael D. Sokoloff and Panagiotis Spentzouris and Hartmut Stadie and
Giordon Stark and Gordon Stewart and Graeme A. Stewart and Arturo Sánchez
and Alberto Sánchez-Hernández and Anyes Taffard and Umberto Tamponi and
Jeff Templon and Giacomo Tenaglia and Vakhtang Tsulaia and Christopher
Tunnell and Eric Vaandering and Andrea Valassi and Sofia Vallecorsa and
Liviu Valsan and Peter Van Gemmeren and Renaud Vernet and Brett Viren and
Jean-Roch Vlimant and Christian Voss and Margaret Votava and Carl Vuosalo
and Carlos Vázquez Sierra and Romain Wartel and Gordon T. Watts and Torre
Wenaus and Sandro Wenzel and Mike Williams and Frank Winklmeier and
Christoph Wissing and Frank Wuerthwein and Benjamin Wynne and Zhang Xiaomei
and Wei Yang and Efe Yazgan}, Title = {{A Roadmap for HEP Software and
Computing R\&D for the 2020s}}, Year = {2017}, Eprint = {arXiv:1712.06982},
}
@online{scitokens,
title = {{The SciTokens project}},
url = {https://scitokens.org},
urldate = {2018-12-03}
}
@online{kubernetes,
title = {{The Kubernetes container orchestrator}},
url = {https://kubernetes.io},
urldate = {2018-12-03}
}
@online{openstack,
title = {{The Openstack IAAS framework}},
url = {https://www.openstack.org},
urldate = {2018-12-03}
}
@online{fts,
title = {{The CERN File Transfer Service}},
url = {https://fts.web.cern.ch},
urldate = {2018-12-03}
}
@online{storm,
title = {{The StoRM storage element}},
url = {https://italiangrid.github.io/storm},
urldate = {2019-05-15}
}
@online{dcache,
title = {{The XRootD software framework}},
url = {https://dcache.org},
urldate = {2019-05-15}
}
@online{xrootd,
title = {{The dCache storage solution}},
url = {http://xrootd.org/},
urldate = {2019-05-15}
}
@online{dpm,
title = {{DPM - Disk Pool Manager}},
url = {http://lcgdm.web.cern.ch/dpm},
urldate = {2019-05-15}
}
@online{eos,
title = {{EOS Open Storage}},
url = {http://eos.web.cern.ch/},
urldate = {2019-05-15}
}
@online{oidc-rande,
title = {{The OpenID Research \& Education working group}},
url = {https://openid.net/wg/rande},
urldate = {2018-12-03}
}
@techreport{voms-ac-format,
author = {Vincenzo Ciaschini and Valerio Venturi and Andrea Ceccanti},
title = {{The VOMS Attribute Certificate format }},
year = {2011},
month = {August},
publisher = {Open Grid Forum},
institution = {Open Grid Forum},
url = {https://www.ogf.org/documents/GFD.182.pdf}
}
@online{aarc-blueprint,
title = {{The AARC Blueprint Architecture}},
url = {https://aarc-project.eu/architecture},
urldate = {2018-12-03}
}
@online{rcauth-ssh,
title = {{RCAuth.eu: getting proxies using SSH key AuthN}},
author = {Mischa Sall\'e},
url = {https://indico.cern.ch/event/669715/contributions/2739035/attachments/1532101/2398499/RCauth_SSH_wlcg_authz_wg.pdf},
urldate = {2018-12-03}
}
@online{oauth4myproxy,
title = {{OAuth for MyProxy}},
url = {http://grid.ncsa.illinois.edu/myproxy/oauth/},
urldate = {2019-03-18}
}
@online{rcauth,
title = {{The RCAuth online CA}},
url = {https://rcauth.eu},
urldate = {2018-12-03}
}
@online{dodas,
title = {{Dynamic On Demand Analysis Service: DODAS}},
url = {https://dodas-ts.github.io/dodas-doc},
urldate = {2018-12-03}
}
@online{eosc-hub,
title = {{The EOSC-Hub project}},
url = {https://www.eosc-hub.eu},
urldate = {2018-12-03}
}
@online{aarc,
title = {{The AARC project}},
url = {https://aarc-project.eu},
urldate = {2018-12-03}
}
@online{fim4r,
title = {{Federated Identity Management for Research}},
url = {https://fim4r.org},
urldate = {2018-12-03}
}
@online{wlcg-authz-wg,
title = {{The WLCG Authorization Working Group}},
url = {https://twiki.cern.ch/twiki/bin/view/LCG/WLCGAuthorizationWG},
urldate = {2018-12-03}
}
@online{nikhef,
title = {{The Dutch National Insititute for Sub-atomic Physics}},
url = {https://www.nikhef.nl},
urldate = {2019-5-10}
}
@misc{indigo-datacloud,
Author = {INDIGO-DataCloud Collaboration and : and Davide Salomoni and Isabel
Campos and Luciano Gaido and Jesus Marco de Lucas and Peter Solagna and Jorge
Gomes and Ludek Matyska and Patrick Fuhrman and Marcus Hardt and Giacinto
Donvito and Lukasz Dutka and Marcin Plociennik and Roberto Barbera and
Ignacio Blanquer and Andrea Ceccanti and Mario David and Cristina Duma and
Alvaro López-García and Germán Moltó and Pablo Orviz and Zdenek Sustr and
Matthew Viljoen and Fernando Aguilar and Luis Alves and Marica Antonacci
and Lucio Angelo Antonelli and Stefano Bagnasco and Alexandre M. J. J.
Bonvin and Riccardo Bruno and Eva Cetinic and Yin Chen and Alessandro Costa
and Davor Davidovic and Benjamin Ertl and Marco Fargetta and Sandro Fiore
and Stefano Gallozzi and Zeynep Kurkcuoglu and Lara Lloret and Joao Martins
and Alessandra Nuzzo and Paola Nassisi and Cosimo Palazzo and Joao Pina and
Eva Sciacca and Daniele Spiga and Marco Antonio Tangaro and Michal Urbaniak
and Sara Vallero and Bas Wegh and Valentina Zaccolo and Federico Zambelli
and Tomasz Zok},
Title = {{INDIGO-DataCloud:A data and computing platform to facilitate seamless
access to e-infrastructures}},
Year = {2017},
Eprint = {arXiv:1711.01981},
}
@online{kubernetes-labels,
title = {{Kubernetes labels and selectors}},
url = {https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/},
urldate = {2018-12-03}
}
@online{spid,
title = {{Sistema Pubblico di Identità Digitale}},
url = {https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/},
urldate = {2018-12-03}
}
@online{hr-db-api-service,
title = {{CERN HR DB API service }},
url = {https://baltig.infn.it/aceccant/cern-hr-db-service},
urldate = {2018-12-03}
}
@online{cern-openshift,
title = {{CERN Openshift PAAS infrastructure}},
url = {http://information-technology.web.cern.ch/services/PaaS-Web-App},
urldate = {2018-12-03}
}
@online{srm-2.2,
title = {{The Storage Resource Manager v. 2.2 specification}},
url = {https://sdm.lbl.gov/srm-wg/doc/SRM.v2.2.070402.html},
urldate = {2018-12-03}
}
@online{keycloak,
title = {{The Keycloak Identity and Access Management system}},
url = {https://www.keycloak.org/},
urldate = {2018-12-03}
}
@inproceedings{cern-sso,
doi = {10.1088/1742-6596/119/8/082008},
url = {https://doi.org/10.1088%2F1742-6596%2F119%2F8%2F082008},
year = 2008,
volume = {119},
number = {8},
pages = {082008},
author = {E Ormancey},
title = {{CERN} single sign on solution},
booktitle = {Journal of Physics: Conference Series}
}
@inproceedings{voms-convergence,
author={Andrea Ceccanti and Vincenzo Ciaschini and Maria Dimou and Gabriele Garzoglio and Tanya Levshina and Steve Traylen and Valerio Venturi},
title={{VOMS/VOMRS utilization patterns and convergence plan}},
booktitle={Journal of Physics: Conference Series},
volume={219},
number={6},
pages={062006},
url={http://stacks.iop.org/1742-6596/219/i=6/a=062006},
year={2010}
}
@inproceedings{gpfs,
author = {Schmuck, Frank and Haskin, Roger},
title = {GPFS: A Shared-disk File System for Large Computing Clusters},
booktitle = {Proceedings of the 1st USENIX Conference on File and Storage Technologies},
series = {FAST'02},
year = {2002},
location = {Monterey, CA},
pages = {16--16},
numpages = {1},
url = {http://dl.acm.org/citation.cfm?id=1973333.1973349},
acmid = {1973349},
publisher = {USENIX Association},
address = {Berkeley, CA, USA},
}
@inproceedings{gemss,
doi = {10.1088/1742-6596/608/1/012013},
url = {https://doi.org/10.1088%2F1742-6596%2F608%2F1%2F012013},
year = 2015,
month = {may},
publisher = {{IOP} Publishing},
volume = {608},
pages = {012013},
author = {Pier Paolo Ricci and Alessandro Cavalli and Luca Dell'Agnello and Matteo Favaro and Daniele Gregori and Andrea Prosperini and Michele Pezzi and Vladimir Sapunenko and Giovanni Zizzi and Vincenzo Vagnoni},
title = {The {INFN}-{CNAF} Tier-1 {GEMSS} Mass Storage System and database facility activity},
booktitle = {Journal of Physics: Conference Series}
}
@online{storm-1.11.13,
title = {{StoRM 1.11.13 release notes}},
url = {http://italiangrid.github.io/storm/release-notes/StoRM-v1.11.13.html},
urldate = {2018-12-03}
}
@online{storm-1.11.14,
title = {{StoRM 1.11.14 release notes}},
url = {http://italiangrid.github.io/storm/release-notes/StoRM-v1.11.14.html},
urldate = {2018-12-03}
}
@online{storage-resource-reporting-proposal,
title = {{Storage Resource Reporting proposal for storage providers}},
url = {https://docs.google.com/document/d/1yzCvKpxsbcQC5K9MyvXc-vBF1HGPBk4vhjw3MEXoXf8},
urldate = {2018-11-23}
}
@online{globus-end-of-support,
title = {{Globus toolkit end-of-support announcement}},
url = {https://www.globus.org/blog/support-open-source-globus-toolkit-ends-january-2018},
urldate = {2018-12-03}
}
@online{doma-tpc,
title = {{The WLCG DOMA Third Party Copy (TPC) working group}},
url = {https://twiki.cern.ch/twiki/bin/view/LCG/ThirdPartyCopy},
urldate = {2018-12-03}
}
@online{spring-boot,
title = {{The Spring Boot project}},
url = {https://spring.io/projects/spring-boot},
urldate = {2018-12-03}
}
@online{yaim,
title = {{Yet Antother Installation Manager}},
url = {https://twiki.cern.ch/twiki/bin/view/EGEE/YAIM},
urldate = {2018-12-03}
}
@online{puppet,
title = {{The puppet configuration management tool}},
url = {https://puppet.com/},
urldate = {2018-12-03}
}
\ No newline at end of file
contributions/sd_storm/high-level-arch.png

65.5 KiB

%%
%% This is file `iopams.sty'
%% File to include AMS fonts and extra definitions for bold greek
%% characters for use with iopart.cls
%%
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{iopams}[1997/02/13 v1.0]
\RequirePackage{amsgen}[1995/01/01]
\RequirePackage{amsfonts}[1995/01/01]
\RequirePackage{amssymb}[1995/01/01]
\RequirePackage{amsbsy}[1995/01/01]
%
\iopamstrue % \newif\ifiopams in iopart.cls & iopbk2e.cls
% % allows optional text to be in author guidelines
%
% Bold lower case Greek letters
%
\newcommand{\balpha}{\boldsymbol{\alpha}}
\newcommand{\bbeta}{\boldsymbol{\beta}}
\newcommand{\bgamma}{\boldsymbol{\gamma}}
\newcommand{\bdelta}{\boldsymbol{\delta}}
\newcommand{\bepsilon}{\boldsymbol{\epsilon}}
\newcommand{\bzeta}{\boldsymbol{\zeta}}
\newcommand{\bfeta}{\boldsymbol{\eta}}
\newcommand{\btheta}{\boldsymbol{\theta}}
\newcommand{\biota}{\boldsymbol{\iota}}
\newcommand{\bkappa}{\boldsymbol{\kappa}}
\newcommand{\blambda}{\boldsymbol{\lambda}}
\newcommand{\bmu}{\boldsymbol{\mu}}
\newcommand{\bnu}{\boldsymbol{\nu}}
\newcommand{\bxi}{\boldsymbol{\xi}}
\newcommand{\bpi}{\boldsymbol{\pi}}
\newcommand{\brho}{\boldsymbol{\rho}}
\newcommand{\bsigma}{\boldsymbol{\sigma}}
\newcommand{\btau}{\boldsymbol{\tau}}
\newcommand{\bupsilon}{\boldsymbol{\upsilon}}
\newcommand{\bphi}{\boldsymbol{\phi}}
\newcommand{\bchi}{\boldsymbol{\chi}}
\newcommand{\bpsi}{\boldsymbol{\psi}}
\newcommand{\bomega}{\boldsymbol{\omega}}
\newcommand{\bvarepsilon}{\boldsymbol{\varepsilon}}
\newcommand{\bvartheta}{\boldsymbol{\vartheta}}
\newcommand{\bvaromega}{\boldsymbol{\varomega}}
\newcommand{\bvarrho}{\boldsymbol{\varrho}}
\newcommand{\bvarzeta}{\boldsymbol{\varsigma}} %NB really sigma
\newcommand{\bvarsigma}{\boldsymbol{\varsigma}}
\newcommand{\bvarphi}{\boldsymbol{\varphi}}
%
% Bold upright capital Greek letters
%
\newcommand{\bGamma}{\boldsymbol{\Gamma}}
\newcommand{\bDelta}{\boldsymbol{\Delta}}
\newcommand{\bTheta}{\boldsymbol{\Theta}}
\newcommand{\bLambda}{\boldsymbol{\Lambda}}
\newcommand{\bXi}{\boldsymbol{\Xi}}
\newcommand{\bPi}{\boldsymbol{\Pi}}
\newcommand{\bSigma}{\boldsymbol{\Sigma}}
\newcommand{\bUpsilon}{\boldsymbol{\Upsilon}}
\newcommand{\bPhi}{\boldsymbol{\Phi}}
\newcommand{\bPsi}{\boldsymbol{\Psi}}
\newcommand{\bOmega}{\boldsymbol{\Omega}}
%
% Bold versions of miscellaneous symbols
%
\newcommand{\bpartial}{\boldsymbol{\partial}}
\newcommand{\bell}{\boldsymbol{\ell}}
\newcommand{\bimath}{\boldsymbol{\imath}}
\newcommand{\bjmath}{\boldsymbol{\jmath}}
\newcommand{\binfty}{\boldsymbol{\infty}}
\newcommand{\bnabla}{\boldsymbol{\nabla}}
\newcommand{\bdot}{\boldsymbol{\cdot}}
%
% Symbols for caption
%
\renewcommand{\opensquare}{\mbox{$\square$}}
\renewcommand{\opentriangle}{\mbox{$\vartriangle$}}
\renewcommand{\opentriangledown}{\mbox{$\triangledown$}}
\renewcommand{\opendiamond}{\mbox{$\lozenge$}}
\renewcommand{\fullsquare}{\mbox{$\blacksquare$}}
\newcommand{\fulldiamond}{\mbox{$\blacklozenge$}}
\newcommand{\fullstar}{\mbox{$\bigstar$}}
\newcommand{\fulltriangle}{\mbox{$\blacktriangle$}}
\newcommand{\fulltriangledown}{\mbox{$\blacktriangledown$}}
\endinput
%%
%% End of file `iopams.sty'.
\NeedsTeXFormat{LaTeX2e}[1995/12/01]
\ProvidesClass{jpconf}
[2007/03/07 v1.1
LaTeX class for Journal of Physics: Conference Series]
%\RequirePackage{graphicx}
\newcommand\@ptsize{1}
\newif\if@restonecol
\newif\if@letterpaper
\newif\if@titlepage
\newif\ifiopams
\@titlepagefalse
\@letterpaperfalse
\DeclareOption{a4paper}
{\setlength\paperheight {297mm}%
\setlength\paperwidth {210mm}%
\@letterpaperfalse}
\DeclareOption{letterpaper}
{\setlength\paperheight {279.4mm}%
\setlength\paperwidth {215.9mm}%
\@letterpapertrue}
\DeclareOption{landscape}
{\setlength\@tempdima {\paperheight}%
\setlength\paperheight {\paperwidth}%
\setlength\paperwidth {\@tempdima}}
\DeclareOption{twoside}{\@twosidetrue \@mparswitchtrue}
\renewcommand\@ptsize{1}
%\ExecuteOptions{A4paper, twoside}
\ExecuteOptions{A4paper}
\ProcessOptions
\DeclareMathAlphabet{\bi}{OML}{cmm}{b}{it}
\DeclareMathAlphabet{\bcal}{OMS}{cmsy}{b}{n}
\input{jpconf1\@ptsize.clo}
\setlength\lineskip{1\p@}
\setlength\normallineskip{1\p@}
\renewcommand\baselinestretch{}
\setlength\parskip{0\p@ \@plus \p@}
\@lowpenalty 51
\@medpenalty 151
\@highpenalty 301
\setlength\parindent{5mm}
\setcounter{topnumber}{8}
\renewcommand\topfraction{1}
\setcounter{bottomnumber}{3}
\renewcommand\bottomfraction{.99}
\setcounter{totalnumber}{8}
\renewcommand\textfraction{0.01}
\renewcommand\floatpagefraction{.8}
\setcounter{dbltopnumber}{6}
\renewcommand\dbltopfraction{1}
\renewcommand\dblfloatpagefraction{.8}
\renewcommand{\title}{\@ifnextchar[{\@stitle}{\@ftitle}}
\pretolerance=5000
\tolerance=8000
% Headings for all pages apart from first
%
\def\ps@headings{%
\let\@oddfoot\@empty
\let\@evenfoot\@empty
\let\@oddhead\@empty
\let\@evenhead\@empty
%\def\@evenhead{\thepage\hfil\itshape\rightmark}%
%\def\@oddhead{{\itshape\leftmark}\hfil\thepage}%
%\def\@evenhead{{\itshape Journal of Physics: Conference Series}\hfill}%
%\def\@oddhead{\hfill {\itshape Journal of Physics: Conference Series}}%%
\let\@mkboth\markboth
\let\sectionmark\@gobble
\let\subsectionmark\@gobble}
%
% Headings for first page
%
\def\ps@myheadings{\let\@oddfoot\@empty\let\@evenfoot\@empty
\let\@oddhead\@empty\let\@evenhead\@empty
\let\@mkboth\@gobbletwo
\let\sectionmark\@gobble
\let\subsectionmark\@gobble}
%
\def\@stitle[#1]#2{\markboth{#1}{#1}%
%\pagestyle{empty}%
\thispagestyle{myheadings}
\vspace*{25mm}{\exhyphenpenalty=10000\hyphenpenalty=10000
%\Large
\fontsize{18bp}{24bp}\selectfont\bf\raggedright\noindent#2\par}}
\def\@ftitle#1{\markboth{#1}{#1}%
\thispagestyle{myheadings}
%\pagestyle{empty}%
\vspace*{25mm}{\exhyphenpenalty=10000\hyphenpenalty=10000
%\Large\raggedright\noindent\bf#1\par}
\fontsize{18bp}{24bp}\selectfont\bf\noindent\raggedright#1\par}}
%AUTHOR
\renewcommand{\author}{\@ifnextchar[{\@sauthor}{\@fauthor}}
\def\@sauthor[#1]#2{\markright{#1} % for production only
\vspace*{1.5pc}%
\begin{indented}%
\item[]\normalsize\bf\raggedright#2
\end{indented}%
\smallskip}
\def\@fauthor#1{%\markright{#1} for production only
\vspace*{1.5pc}%
\begin{indented}%
\item[]\normalsize\bf\raggedright#1
\end{indented}%
\smallskip}
%E-MAIL
\def\eads#1{\vspace*{5pt}\address{E-mail: #1}}
\def\ead#1{\vspace*{5pt}\address{E-mail: \mailto{#1}}}
\def\mailto#1{{\tt #1}}
%ADDRESS
\newcommand{\address}[1]{\begin{indented}
\item[]\rm\raggedright #1
\end{indented}}
\newlength{\indentedwidth}
\newdimen\mathindent
\mathindent = 6pc
\indentedwidth=\mathindent
% FOOTNOTES
%\renewcommand\footnoterule{%
% \kern-3\p@
% \hrule\@width.4\columnwidth
% \kern2.6\p@}
%\newcommand\@makefntext[1]{%
% \parindent 1em%
% \noindent
% \hb@xt@1.8em{\hss\@makefnmark}#1}
% Footnotes: symbols selected in same order as address indicators
% unless optional argument of [<num>] use to specify required symbol,
% 1=\dag, 2=\ddag, etc
% Usage: \footnote{Text of footnote}
% \footnote[3]{Text of footnote}
%
\def\footnoterule{}%
\setcounter{footnote}{0}
\long\def\@makefntext#1{\parindent 1em\noindent
\makebox[1em][l]{\footnotesize\rm$\m@th{\fnsymbol{footnote}}$}%
\footnotesize\rm #1}
\def\@makefnmark{\normalfnmark}
\def\normalfnmark{\hbox{${\fnsymbol{footnote}}\m@th$}}
\def\altfnmark{\hbox{$^{\rm Note}\ {\fnsymbol{footnote}}\m@th$}}
\def\footNote#1{\let\@makefnmark\altfnmark\footnote{#1}\let\@makefnmark\normalfnmark}
\def\@thefnmark{\fnsymbol{footnote}}
\def\footnote{\protect\pfootnote}
\def\pfootnote{\@ifnextchar[{\@xfootnote}{\stepcounter{\@mpfn}%
\begingroup\let\protect\noexpand
\xdef\@thefnmark{\thempfn}\endgroup
\@footnotemark\@footnotetext}}
\def\@xfootnote[#1]{\setcounter{footnote}{#1}%
\addtocounter{footnote}{-1}\footnote}
\newcommand\ftnote{\protect\pftnote}
\newcommand\pftnote[1]{\setcounter{footnote}{#1}%
\addtocounter{footnote}{-1}\footnote}
\newcommand{\fnm}[1]{\setcounter{footnote}{#1}\footnotetext}
\def\@fnsymbol#1{\ifnum\thefootnote=99\hbox{*}\else^{\thefootnote}\fi\relax}
%
% Address marker
%
\newcommand{\ad}[1]{\noindent\hbox{$^{#1}$}\relax}
\newcommand{\adnote}[2]{\noindent\hbox{$^{#1,}$}\setcounter{footnote}{#2}%
\addtocounter{footnote}{-1}\footnote}
\def\@tnote{}
\newcounter{oldftnote}
\newcommand{\tnote}[1]{*\gdef\@tnote{%
\setcounter{oldftnote}{\c@footnote}%
\setcounter{footnote}{99}%
\footnotetext{#1}%
\setcounter{footnote}{\c@oldftnote}\addtocounter{footnote}{-1}}}
%==================
% Acknowledgments (no heading if letter)
% Usage \ack for Acknowledgments, \ackn for Acknowledgement
\def\ack{\section*{Acknowledgments}}
\def\ackn{\section*{Acknowledgment}}
%SECTION DEFINITIONS
\setcounter{secnumdepth}{3}
\newcounter {section}
\newcounter {subsection}[section]
\newcounter {subsubsection}[subsection]
\newcounter {paragraph}[subsubsection]
\newcounter {subparagraph}[paragraph]
\renewcommand \thesection {\arabic{section}}
\renewcommand\thesubsection {\thesection.\arabic{subsection}}
\renewcommand\thesubsubsection{\thesubsection .\arabic{subsubsection}}
\renewcommand\theparagraph {\thesubsubsection.\arabic{paragraph}}
\renewcommand\thesubparagraph {\theparagraph.\arabic{subparagraph}}
%\nosections
\def\nosections{\vspace{30\p@ plus12\p@ minus12\p@}
\noindent\ignorespaces}
%\renewcommand{\@startsection}[6]
%{%
%\if@noskipsec \leavevmode \fi
%\par
% \@tempskipa #4\relax
%%\@tempskipa 0pt\relax
% \@afterindenttrue
% \ifdim \@tempskipa <\z@
% \@tempskipa -\@tempskipa \@afterindentfalse
% \fi
% \if@nobreak
% \everypar{}%
% \else
% \addpenalty\@secpenalty\addvspace\@tempskipa
% \fi
% \@ifstar
% {\@ssect{#3}{#4}{#5}{#6}}%
% {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}}
%\renewcommand{\@sect}[8]{%
% \ifnum #2>\c@secnumdepth
% \let\@svsec\@empty
% \else
% \refstepcounter{#1}%
% \protected@edef\@svsec{\@seccntformat{#1}\relax}%
% \fi
% \@tempskipa #5\relax
% \ifdim \@tempskipa>\z@
% \begingroup
% #6{%
% \@hangfrom{\hskip #3\relax\@svsec}%
% \interlinepenalty \@M #8\@@par}%
% \endgroup
% \csname #1mark\endcsname{#7}%
% \addcontentsline{toc}{#1}{%
% \ifnum #2>\c@secnumdepth \else
% \protect\numberline{\csname the#1\endcsname}%
% \fi
% #7}%
% \else
% \def\@svsechd{%
% #6{\hskip #3\relax
% \@svsec #8}%
% \csname #1mark\endcsname{#7}%
% \addcontentsline{toc}{#1}{%
% \ifnum #2>\c@secnumdepth \else
% \protect\numberline{\csname the#1\endcsname}%
% \fi
% #7}}%
% \fi
% \@xsect{#5}}
%\renewcommand{\@xsect}[1]{%
% \@tempskipa #1\relax
% \ifdim \@tempskipa>\z@
% \par \nobreak
% \vskip \@tempskipa
% \@afterheading
% \else
% \@nobreakfalse
% \global\@noskipsectrue
% \everypar{%
% \if@noskipsec
% \global\@noskipsecfalse
% {\setbox\z@\lastbox}%
% \clubpenalty\@M
% \begingroup \@svsechd \endgroup
% \unskip
% \@tempskipa #1\relax
% \hskip -\@tempskipa
% \else
% \clubpenalty \@clubpenalty
% \everypar{}%
% \fi}%
% \fi
% \ignorespaces}
%========================================================================
\newcommand\section{\@startsection {section}{1}{\z@}%
{-3.25ex\@plus -1ex \@minus -.2ex}%
{1sp}%
{\reset@font\normalsize\bfseries\raggedright}}
\newcommand\subsection{\@startsection{subsection}{2}{\z@}%
{-3.25ex\@plus -1ex \@minus -.2ex}%
{1sp}%
{\reset@font\normalsize\itshape\raggedright}}
\newcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}%
{-3.25ex\@plus -1ex \@minus -.2ex}%
{-1em \@plus .2em}%
{\reset@font\normalsize\itshape}}
\newcommand\paragraph{\@startsection{paragraph}{4}{\z@}%
{3.25ex \@plus1ex \@minus.2ex}%
{-1em}%
{\reset@font\normalsize\itshape}}
\newcommand\subparagraph{\@startsection{subparagraph}{5}{\parindent}%
{3.25ex \@plus1ex \@minus .2ex}%
{-1em}%
{\reset@font\normalsize\itshape}}
\def\@sect#1#2#3#4#5#6[#7]#8{\ifnum #2>\c@secnumdepth
\let\@svsec\@empty\else
\refstepcounter{#1}\edef\@svsec{\csname the#1\endcsname. }\fi
\@tempskipa #5\relax
\ifdim \@tempskipa>\z@
\begingroup #6\relax
\noindent{\hskip #3\relax\@svsec}{\interlinepenalty \@M #8\par}%
\endgroup
\csname #1mark\endcsname{#7}\addcontentsline
{toc}{#1}{\ifnum #2>\c@secnumdepth \else
\protect\numberline{\csname the#1\endcsname}\fi
#7}\else
\def\@svsechd{#6\hskip #3\relax %% \relax added 2 May 90
\@svsec #8\csname #1mark\endcsname
{#7}\addcontentsline
{toc}{#1}{\ifnum #2>\c@secnumdepth \else
\protect\numberline{\csname the#1\endcsname}\fi
#7}}\fi
\@xsect{#5}}
%
\def\@ssect#1#2#3#4#5{\@tempskipa #3\relax
\ifdim \@tempskipa>\z@
\begingroup #4\noindent{\hskip #1}{\interlinepenalty \@M #5\par}\endgroup
\else \def\@svsechd{#4\hskip #1\relax #5}\fi
\@xsect{#3}}
% LIST DEFINITIONS
\setlength\leftmargini {2em}
\leftmargin \leftmargini
\setlength\leftmarginii {2em}
\setlength\leftmarginiii {1.8em}
\setlength\leftmarginiv {1.6em}
\setlength\leftmarginv {1em}
\setlength\leftmarginvi {1em}
\setlength\leftmargin{\leftmargini}
\setlength \labelsep {.5em}
\setlength \labelwidth{\leftmargini}
\addtolength\labelwidth{-\labelsep}
\@beginparpenalty -\@lowpenalty
\@endparpenalty -\@lowpenalty
\@itempenalty -\@lowpenalty
\renewcommand\theenumi{\roman{enumi}}
\renewcommand\theenumii{\alph{enumii}}
\renewcommand\theenumiii{\arabic{enumiii}}
\renewcommand\theenumiv{\Alph{enumiv}}
\newcommand\labelenumi{(\theenumi)}
\newcommand\labelenumii{(\theenumii)}
\newcommand\labelenumiii{\theenumiii.}
\newcommand\labelenumiv{(\theenumiv)}
\renewcommand\p@enumii{(\theenumi)}
\renewcommand\p@enumiii{(\theenumi.\theenumii)}
\renewcommand\p@enumiv{(\theenumi.\theenumii.\theenumiii)}
\newcommand\labelitemi{$\m@th\bullet$}
\newcommand\labelitemii{\normalfont\bfseries --}
\newcommand\labelitemiii{$\m@th\ast$}
\newcommand\labelitemiv{$\m@th\cdot$}
\renewcommand \theequation {\@arabic\c@equation}
%%%%%%%%%%%%% Figures
\newcounter{figure}
\renewcommand\thefigure{\@arabic\c@figure}
\def\fps@figure{tbp}
\def\ftype@figure{1}
\def\ext@figure{lof}
\def\fnum@figure{\figurename~\thefigure}
\newenvironment{figure}{\footnotesize\rm\@float{figure}}%
{\end@float\normalsize\rm}
\newenvironment{figure*}{\footnotesize\rm\@dblfloat{figure}}{\end@dblfloat}
\newcounter{table}
\renewcommand\thetable{\@arabic\c@table}
\def\fps@table{tbp}
\def\ftype@table{2}
\def\ext@table{lot}
\def\fnum@table{\tablename~\thetable}
\newenvironment{table}{\footnotesize\rm\@float{table}}%
{\end@float\normalsize\rm}
\newenvironment{table*}{\footnotesize\rm\@dblfloat{table}}%
{\end@dblfloat\normalsize\rm}
\newlength\abovecaptionskip
\newlength\belowcaptionskip
\setlength\abovecaptionskip{10\p@}
\setlength\belowcaptionskip{0\p@}
%Table Environments
%\newenvironment{tableref}[3][\textwidth]{%
%\begin{center}%
%\begin{table}%
%\captionsetup[table]{width=#1}
%\centering\caption{\label{#2}#3}}{\end{table}\end{center}}
%%%%%%%%%%%%%%%%%
%\newcounter{figure}
%\renewcommand \thefigure {\@arabic\c@figure}
%\def\fps@figure{tbp}
%\def\ftype@figure{1}
%\def\ext@figure{lof}
%\def\fnum@figure{\figurename~\thefigure}
%ENVIRONMENT: figure
%\newenvironment{figure}
% {\@float{figure}}
% {\end@float}
%ENVIRONMENT: figure*
%\newenvironment{figure*}
% {\@dblfloat{figure}}
% {\end@dblfloat}
%ENVIRONMENT: table
%\newcounter{table}
%\renewcommand\thetable{\@arabic\c@table}
%\def\fps@table{tbp}
%\def\ftype@table{2}
%\def\ext@table{lot}
%\def\fnum@table{\tablename~\thetable}
%\newenvironment{table}
% {\@float{table}}
% {\end@float}
%ENVIRONMENT: table*
%\newenvironment{table*}
% {\@dblfloat{table}}
% {\end@dblfloat}
%\newlength\abovecaptionskip
%\newlength\belowcaptionskip
%\setlength\abovecaptionskip{10\p@}
%\setlength\belowcaptionskip{0\p@}
% CAPTIONS
% Added redefinition of \@caption so captions are not written to
% aux file therefore less need to \protect fragile commands
%
\long\def\@caption#1[#2]#3{\par\begingroup
\@parboxrestore
\normalsize
\@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par
\endgroup}
\long\def\@makecaption#1#2{%
\vskip\abovecaptionskip
\sbox\@tempboxa{{\bf #1.} #2}%
\ifdim \wd\@tempboxa >\hsize
{\bf #1.} #2\par
\else
\global \@minipagefalse
\hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
\fi
\vskip\belowcaptionskip}
\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm}
\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf}
\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt}
\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf}
\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit}
\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl}
\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc}
\DeclareRobustCommand*\cal{\@fontswitch\relax\mathcal}
\DeclareRobustCommand*\mit{\@fontswitch\relax\mathnormal}
%\newcommand\@pnumwidth{1.55em}
%\newcommand\@tocrmarg{2.55em}
%\newcommand\@dotsep{4.5}
%\setcounter{tocdepth}{3}
%\newcommand\tableofcontents{%
% \section*{\contentsname
% \@mkboth{%
% \MakeUppercase\contentsname}{\MakeUppercase\contentsname}}%
% \@starttoc{toc}%
% }
%\newcommand*\l@part[2]{%
% \ifnum \c@tocdepth >-2\relax
% \addpenalty\@secpenalty
% \addvspace{2.25em \@plus\p@}%
% \begingroup
% \parindent \z@ \rightskip \@pnumwidth
% \parfillskip -\@pnumwidth
% {\leavevmode
% \large \bfseries #1\hfil \hb@xt@\@pnumwidth{\hss #2}}\par
% \nobreak
% \if@compatibility
% \global\@nobreaktrue
% \everypar{\global\@nobreakfalse\everypar{}}%
% \fi
% \endgroup
% \fi}
%\newcommand*\l@section[2]{%
% \ifnum \c@tocdepth >\z@
% \addpenalty\@secpenalty
% \addvspace{1.0em \@plus\p@}%
% \setlength\@tempdima{1.5em}%
% \begingroup
% \parindent \z@ \rightskip \@pnumwidth
% \parfillskip -\@pnumwidth
% \leavevmode \bfseries
% \advance\leftskip\@tempdima
% \hskip -\leftskip
% #1\nobreak\hfil \nobreak\hb@xt@\@pnumwidth{\hss #2}\par
% \endgroup
% \fi}
%\newcommand*\l@subsection{\@dottedtocline{2}{1.5em}{2.3em}}
%\newcommand*\l@subsubsection{\@dottedtocline{3}{3.8em}{3.2em}}
%\newcommand*\l@paragraph{\@dottedtocline{4}{7.0em}{4.1em}}
%\newcommand*\l@subparagraph{\@dottedtocline{5}{10em}{5em}}
%\newcommand\listoffigures{%
% \section*{\listfigurename
% \@mkboth{\MakeUppercase\listfigurename}%
% {\MakeUppercase\listfigurename}}%
% \@starttoc{lof}%
% }
%\newcommand*\l@figure{\@dottedtocline{1}{1.5em}{2.3em}}
%\newcommand\listoftables{%
% \section*{\listtablename
% \@mkboth{%
% \MakeUppercase\listtablename}{\MakeUppercase\listtablename}}%
% \@starttoc{lot}%
% }
%\let\l@table\l@figure
%======================================
%ENVIRONMENTS
%======================================
%ENVIRONMENT: indented
\newenvironment{indented}{\begin{indented}}{\end{indented}}
\newenvironment{varindent}[1]{\begin{varindent}{#1}}{\end{varindent}}
%
\def\indented{\list{}{\itemsep=0\p@\labelsep=0\p@\itemindent=0\p@
\labelwidth=0\p@\leftmargin=\mathindent\topsep=0\p@\partopsep=0\p@
\parsep=0\p@\listparindent=15\p@}\footnotesize\rm}
\let\endindented=\endlist
\def\varindent#1{\setlength{\varind}{#1}%
\list{}{\itemsep=0\p@\labelsep=0\p@\itemindent=0\p@
\labelwidth=0\p@\leftmargin=\varind\topsep=0\p@\partopsep=0\p@
\parsep=0\p@\listparindent=15\p@}\footnotesize\rm}
\let\endvarindent=\endlist
%ENVIRONMENT: abstract
\newenvironment{abstract}{%
\vspace{16pt plus3pt minus3pt}
\begin{indented}
\item[]{\bfseries \abstractname.}\quad\rm\ignorespaces}
{\end{indented}\vspace{10mm}}
%ENVIRONMENT: description
\newenvironment{description}
{\list{}{\labelwidth\z@ \itemindent-\leftmargin
\let\makelabel\descriptionlabel}}
{\endlist}
\newcommand\descriptionlabel[1]{\hspace\labelsep
\normalfont\bfseries #1}
%ENVIRONMENT: quotation
\newenvironment{quotation}
{\list{}{\listparindent 1.5em%
\itemindent \listparindent
\rightmargin \leftmargin
\parsep \z@ \@plus\p@}%
\item[]}
{\endlist}
%ENVIRONMENT: quote
\newenvironment{quote}
{\list{}{\rightmargin\leftmargin}%
\item[]}
{\endlist}
%ENVIRONMENT: verse
\newenvironment{verse}
{\let\\=\@centercr
\list{}{\itemsep \z@
\itemindent -1.5em%
\listparindent\itemindent
\rightmargin \leftmargin
\advance\leftmargin 1.5em}%
\item[]}
{\endlist}
%ENVIRONMENT: bibliography
\newdimen\bibindent
\setlength\bibindent{1.5em}
\def\thebibliography#1{\list
{\hfil[\arabic{enumi}]}{\topsep=0\p@\parsep=0\p@
\partopsep=0\p@\itemsep=0\p@
\labelsep=5\p@\itemindent=-10\p@
\settowidth\labelwidth{\footnotesize[#1]}%
\leftmargin\labelwidth
\advance\leftmargin\labelsep
\advance\leftmargin -\itemindent
\usecounter{enumi}}\footnotesize
\def\newblock{\ }
\sloppy\clubpenalty4000\widowpenalty4000
\sfcode`\.=1000\relax}
\let\endthebibliography=\endlist
\def\numrefs#1{\begin{thebibliography}{#1}}
\def\endnumrefs{\end{thebibliography}}
\let\endbib=\endnumrefs
%%%%%%%%%%%%%%%%%%
%\newenvironment{thebibliography}[1]
% {\section*{References}
% \list{\@biblabel{\@arabic\c@enumiv}}%
% {\settowidth\labelwidth{\@biblabel{#1}}%
% \leftmargin\labelwidth
% \advance\leftmargin\labelsep
% \@openbib@code
% \usecounter{enumiv}%
% \let\p@enumiv\@empty
% \renewcommand\theenumiv{\@arabic\c@enumiv}}%
% \sloppy
% \clubpenalty4000
% \@clubpenalty \clubpenalty
% \widowpenalty4000%
% \sfcode`\.\@m}
% {\def\@noitemerr
% {\@latex@warning{Empty `thebibliography' environment}}%
% \endlist}
%\newcommand\newblock{\hskip .11em\@plus.33em\@minus.07em}
%\let\@openbib@code\@empty
%ENVIRONMENT: theindex
\newenvironment{theindex}
{\if@twocolumn
\@restonecolfalse
\else
\@restonecoltrue
\fi
\columnseprule \z@
\columnsep 35\p@
\twocolumn[\section*{\indexname}]%
\@mkboth{\MakeUppercase\indexname}%
{\MakeUppercase\indexname}%
\thispagestyle{plain}\parindent\z@
\parskip\z@ \@plus .3\p@\relax
\let\item\@idxitem}
{\if@restonecol\onecolumn\else\clearpage\fi}
\newcommand\@idxitem{\par\hangindent 40\p@}
\newcommand\subitem{\@idxitem \hspace*{20\p@}}
\newcommand\subsubitem{\@idxitem \hspace*{30\p@}}
\newcommand\indexspace{\par \vskip 10\p@ \@plus5\p@ \@minus3\p@\relax}
%=====================
\def\appendix{\@ifnextchar*{\@appendixstar}{\@appendix}}
\def\@appendix{\eqnobysec\@appendixstar}
\def\@appendixstar{\@@par
\ifnumbysec % Added 30/4/94 to get Table A1,
\@addtoreset{table}{section} % Table B1 etc if numbering by
\@addtoreset{figure}{section}\fi % section
\setcounter{section}{0}
\setcounter{subsection}{0}
\setcounter{subsubsection}{0}
\setcounter{equation}{0}
\setcounter{figure}{0}
\setcounter{table}{0}
\def\thesection{Appendix \Alph{section}}
\def\theequation{\ifnumbysec
\Alph{section}.\arabic{equation}\else
\Alph{section}\arabic{equation}\fi} % Comment A\arabic{equation} maybe
\def\thetable{\ifnumbysec % better? 15/4/95
\Alph{section}\arabic{table}\else
A\arabic{table}\fi}
\def\thefigure{\ifnumbysec
\Alph{section}\arabic{figure}\else
A\arabic{figure}\fi}}
\def\noappendix{\setcounter{figure}{0}
\setcounter{table}{0}
\def\thetable{\arabic{table}}
\def\thefigure{\arabic{figure}}}
\setlength\arraycolsep{5\p@}
\setlength\tabcolsep{6\p@}
\setlength\arrayrulewidth{.4\p@}
\setlength\doublerulesep{2\p@}
\setlength\tabbingsep{\labelsep}
\skip\@mpfootins = \skip\footins
\setlength\fboxsep{3\p@}
\setlength\fboxrule{.4\p@}
\renewcommand\theequation{\arabic{equation}}
% NAME OF STRUCTURES
\newcommand\contentsname{Contents}
\newcommand\listfigurename{List of Figures}
\newcommand\listtablename{List of Tables}
\newcommand\refname{References}
\newcommand\indexname{Index}
\newcommand\figurename{Figure}
\newcommand\tablename{Table}
\newcommand\partname{Part}
\newcommand\appendixname{Appendix}
\newcommand\abstractname{Abstract}
%Miscellaneous commands
\newcommand{\BibTeX}{{\rm B\kern-.05em{\sc i\kern-.025em b}\kern-.08em
T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}}
\newcommand{\jpcsit}{{\bfseries\itshape\selectfont Journal of Physics: Conference Series}}
\newcommand{\jpcs}{{\itshape\selectfont Journal of Physics: Conference Series}}
\newcommand{\iopp}{IOP Publishing}
\newcommand{\cls}{{\upshape\selectfont\texttt{jpconf.cls}}}
\newcommand{\corg}{conference organizer}
\newcommand\today{\number\day\space\ifcase\month\or
January\or February\or March\or April\or May\or June\or
July\or August\or September\or October\or November\or December\fi
\space\number\year}
\setlength\columnsep{10\p@}
\setlength\columnseprule{0\p@}
\newcommand{\Tables}{\clearpage\section*{Tables and table captions}
\def\fps@table{hp}\noappendix}
\newcommand{\Figures}{\clearpage\section*{Figure captions}
\def\fps@figure{hp}\noappendix}
%
\newcommand{\Figure}[1]{\begin{figure}
\caption{#1}
\end{figure}}
%
\newcommand{\Table}[1]{\begin{table}
\caption{#1}
\begin{indented}
\lineup
\item[]\begin{tabular}{@{}l*{15}{l}}}
\def\endTable{\end{tabular}\end{indented}\end{table}}
\let\endtab=\endTable
%
\newcommand{\fulltable}[1]{\begin{table}
\caption{#1}
\lineup
\begin{tabular*}{\textwidth}{@{}l*{15}{@{\extracolsep{0pt plus 12pt}}l}}}
\def\endfulltable{\end{tabular*}\end{table}}
%BIBLIOGRAPHY and References
%\newcommand{\Bibliography}[1]{\section*{References}\par\numrefs{#1}}
%\newcommand{\References}{\section*{References}\par\refs}
%\def\thebibliography#1{\list
% {\hfil[\arabic{enumi}]}{\topsep=0\p@\parsep=0\p@
% \partopsep=0\p@\itemsep=0\p@
% \labelsep=5\p@\itemindent=-10\p@
% \settowidth\labelwidth{\footnotesize[#1]}%
% \leftmargin\labelwidth
% \advance\leftmargin\labelsep
% \advance\leftmargin -\itemindent
% \usecounter{enumi}}\footnotesize
% \def\newblock{\ }
% \sloppy\clubpenalty4000\widowpenalty4000
% \sfcode`\.=1000\relax}
%\let\endthebibliography=\endlist
%\def\numrefs#1{\begin{thebibliography}{#1}}
%\def\endnumrefs{\end{thebibliography}}
%\let\endbib=\endnumrefs
\def\thereferences{\list{}{\topsep=0\p@\parsep=0\p@
\partopsep=0\p@\itemsep=0\p@\labelsep=0\p@\itemindent=-18\p@
\labelwidth=0\p@\leftmargin=18\p@
}\footnotesize\rm
\def\newblock{\ }
\sloppy\clubpenalty4000\widowpenalty4000
\sfcode`\.=1000\relax}%
\let\endthereferences=\endlist
% MISC EQUATRION STUFF
%\def\[{\relax\ifmmode\@badmath\else
% \begin{trivlist}
% \@beginparpenalty\predisplaypenalty
% \@endparpenalty\postdisplaypenalty
% \item[]\leavevmode
% \hbox to\linewidth\bgroup$ \displaystyle
% \hskip\mathindent\bgroup\fi}
%\def\]{\relax\ifmmode \egroup $\hfil \egroup \end{trivlist}\else \@badmath \fi}
%\def\equation{\@beginparpenalty\predisplaypenalty
% \@endparpenalty\postdisplaypenalty
%\refstepcounter{equation}\trivlist \item[]\leavevmode
% \hbox to\linewidth\bgroup $ \displaystyle
%\hskip\mathindent}
%\def\endequation{$\hfil \displaywidth\linewidth\@eqnnum\egroup \endtrivlist}
%\@namedef{equation*}{\[}
%\@namedef{endequation*}{\]}
%\def\eqnarray{\stepcounter{equation}\let\@currentlabel=\theequation
%\global\@eqnswtrue
%\global\@eqcnt\z@\tabskip\mathindent\let\\=\@eqncr
%\abovedisplayskip\topsep\ifvmode\advance\abovedisplayskip\partopsep\fi
%\belowdisplayskip\abovedisplayskip
%\belowdisplayshortskip\abovedisplayskip
%\abovedisplayshortskip\abovedisplayskip
%$$\halign to
%\linewidth\bgroup\@eqnsel$\displaystyle\tabskip\z@
% {##{}}$&\global\@eqcnt\@ne $\displaystyle{{}##{}}$\hfil
% &\global\@eqcnt\tw@ $\displaystyle{{}##}$\hfil
% \tabskip\@centering&\llap{##}\tabskip\z@\cr}
%\def\endeqnarray{\@@eqncr\egroup
% \global\advance\c@equation\m@ne$$\global\@ignoretrue }
%\mathindent = 6pc
%%
%\def\eqalign#1{\null\vcenter{\def\\{\cr}\openup\jot\m@th
% \ialign{\strut$\displaystyle{##}$\hfil&$\displaystyle{{}##}$\hfil
% \crcr#1\crcr}}\,}
%%
%\def\eqalignno#1{\displ@y \tabskip\z@skip
% \halign to\displaywidth{\hspace{5pc}$\@lign\displaystyle{##}$%
% \tabskip\z@skip
% &$\@lign\displaystyle{{}##}$\hfill\tabskip\@centering
% &\llap{$\@lign\hbox{\rm##}$}\tabskip\z@skip\crcr
% #1\crcr}}
%%
\newif\ifnumbysec
\def\theequation{\ifnumbysec
\arabic{section}.\arabic{equation}\else
\arabic{equation}\fi}
\def\eqnobysec{\numbysectrue\@addtoreset{equation}{section}}
\newcounter{eqnval}
\def\numparts{\addtocounter{equation}{1}%
\setcounter{eqnval}{\value{equation}}%
\setcounter{equation}{0}%
\def\theequation{\ifnumbysec
\arabic{section}.\arabic{eqnval}{\it\alph{equation}}%
\else\arabic{eqnval}{\it\alph{equation}}\fi}}
\def\endnumparts{\def\theequation{\ifnumbysec
\arabic{section}.\arabic{equation}\else
\arabic{equation}\fi}%
\setcounter{equation}{\value{eqnval}}}
%
\def\cases#1{%
\left\{\,\vcenter{\def\\{\cr}\normalbaselines\openup1\jot\m@th%
\ialign{\strut$\displaystyle{##}\hfil$&\tqs
\rm##\hfil\crcr#1\crcr}}\right.}%
\def\eqalign#1{\null\vcenter{\def\\{\cr}\openup\jot\m@th
\ialign{\strut$\displaystyle{##}$\hfil&$\displaystyle{{}##}$\hfil
\crcr#1\crcr}}\,}
% OTHER USEFUL BITS
\newcommand{\e}{\mathrm{e}}
\newcommand{\rme}{\mathrm{e}}
\newcommand{\rmi}{\mathrm{i}}
\newcommand{\rmd}{\mathrm{d}}
\renewcommand{\qquad}{\hspace*{25pt}}
\newcommand{\tdot}[1]{\stackrel{\dots}{#1}} % Added 1/9/94
\newcommand{\tqs}{\hspace*{25pt}}
\newcommand{\fl}{\hspace*{-\mathindent}}
\newcommand{\Tr}{\mathop{\mathrm{Tr}}\nolimits}
\newcommand{\tr}{\mathop{\mathrm{tr}}\nolimits}
\newcommand{\Or}{\mathord{\mathrm{O}}} %changed from \mathop 20/1/95
\newcommand{\lshad}{[\![}
\newcommand{\rshad}{]\!]}
\newcommand{\case}[2]{{\textstyle\frac{#1}{#2}}}
\def\pt(#1){({\it #1\/})}
\newcommand{\dsty}{\displaystyle}
\newcommand{\tsty}{\textstyle}
\newcommand{\ssty}{\scriptstyle}
\newcommand{\sssty}{\scriptscriptstyle}
\def\lo#1{\llap{${}#1{}$}}
\def\eql{\llap{${}={}$}}
\def\lsim{\llap{${}\sim{}$}}
\def\lsimeq{\llap{${}\simeq{}$}}
\def\lequiv{\llap{${}\equiv{}$}}
%
\newcommand{\eref}[1]{(\ref{#1})}
%\newcommand{\eqref}[1]{Equation (\ref{#1})}
%\newcommand{\Eqref}[1]{Equation (\ref{#1})}
\newcommand{\sref}[1]{section~\ref{#1}}
\newcommand{\fref}[1]{figure~\ref{#1}}
\newcommand{\tref}[1]{table~\ref{#1}}
\newcommand{\Sref}[1]{Section~\ref{#1}}
\newcommand{\Fref}[1]{Figure~\ref{#1}}
\newcommand{\Tref}[1]{Table~\ref{#1}}
\newcommand{\opencircle}{\mbox{\Large$\circ\,$}} % moved Large outside maths
\newcommand{\opensquare}{\mbox{$\rlap{$\sqcap$}\sqcup$}}
\newcommand{\opentriangle}{\mbox{$\triangle$}}
\newcommand{\opentriangledown}{\mbox{$\bigtriangledown$}}
\newcommand{\opendiamond}{\mbox{$\diamondsuit$}}
\newcommand{\fullcircle}{\mbox{{\Large$\bullet\,$}}} % moved Large outside maths
\newcommand{\fullsquare}{\,\vrule height5pt depth0pt width5pt}
\newcommand{\dotted}{\protect\mbox{${\mathinner{\cdotp\cdotp\cdotp\cdotp\cdotp\cdotp}}$}}
\newcommand{\dashed}{\protect\mbox{-\; -\; -\; -}}
\newcommand{\broken}{\protect\mbox{-- -- --}}
\newcommand{\longbroken}{\protect\mbox{--- --- ---}}
\newcommand{\chain}{\protect\mbox{--- $\cdot$ ---}}
\newcommand{\dashddot}{\protect\mbox{--- $\cdot$ $\cdot$ ---}}
\newcommand{\full}{\protect\mbox{------}}
\def\;{\protect\psemicolon}
\def\psemicolon{\relax\ifmmode\mskip\thickmuskip\else\kern .3333em\fi}
\def\lineup{\def\0{\hbox{\phantom{0}}}%
\def\m{\hbox{$\phantom{-}$}}%
\def\-{\llap{$-$}}}
%
%%%%%%%%%%%%%%%%%%%%%
% Tables rules %
%%%%%%%%%%%%%%%%%%%%%
\newcommand{\boldarrayrulewidth}{1\p@}
% Width of bold rule in tabular environment.
\def\bhline{\noalign{\ifnum0=`}\fi\hrule \@height
\boldarrayrulewidth \futurelet \@tempa\@xhline}
\def\@xhline{\ifx\@tempa\hline\vskip \doublerulesep\fi
\ifnum0=`{\fi}}
%
% Rules for tables with extra space around
%
\newcommand{\br}{\ms\bhline\ms}
\newcommand{\mr}{\ms\hline\ms}
%
\newcommand{\centre}[2]{\multispan{#1}{\hfill #2\hfill}}
\newcommand{\crule}[1]{\multispan{#1}{\hspace*{\tabcolsep}\hrulefill
\hspace*{\tabcolsep}}}
\newcommand{\fcrule}[1]{\ifnum\thetabtype=1\multispan{#1}{\hrulefill
\hspace*{\tabcolsep}}\else\multispan{#1}{\hrulefill}\fi}
%
% Extra spaces for tables and displayed equations
%
\newcommand{\ms}{\noalign{\vspace{3\p@ plus2\p@ minus1\p@}}}
\newcommand{\bs}{\noalign{\vspace{6\p@ plus2\p@ minus2\p@}}}
\newcommand{\ns}{\noalign{\vspace{-3\p@ plus-1\p@ minus-1\p@}}}
\newcommand{\es}{\noalign{\vspace{6\p@ plus2\p@ minus2\p@}}\displaystyle}%
%
\newcommand{\etal}{{\it et al\/}\ }
\newcommand{\dash}{------}
\newcommand{\nonum}{\par\item[]} %\par added 1/9/93
\newcommand{\mat}[1]{\underline{\underline{#1}}}
%
% abbreviations for IOPP journals
%
\newcommand{\CQG}{{\it Class. Quantum Grav.} }
\newcommand{\CTM}{{\it Combust. Theory Modelling\/} }
\newcommand{\DSE}{{\it Distrib. Syst. Engng\/} }
\newcommand{\EJP}{{\it Eur. J. Phys.} }
\newcommand{\HPP}{{\it High Perform. Polym.} } % added 4/5/93
\newcommand{\IP}{{\it Inverse Problems\/} }
\newcommand{\JHM}{{\it J. Hard Mater.} } % added 4/5/93
\newcommand{\JO}{{\it J. Opt.} }
\newcommand{\JOA}{{\it J. Opt. A: Pure Appl. Opt.} }
\newcommand{\JOB}{{\it J. Opt. B: Quantum Semiclass. Opt.} }
\newcommand{\JPA}{{\it J. Phys. A: Math. Gen.} }
\newcommand{\JPB}{{\it J. Phys. B: At. Mol. Phys.} } %1968-87
\newcommand{\jpb}{{\it J. Phys. B: At. Mol. Opt. Phys.} } %1988 and onwards
\newcommand{\JPC}{{\it J. Phys. C: Solid State Phys.} } %1968--1988
\newcommand{\JPCM}{{\it J. Phys.: Condens. Matter\/} } %1989 and onwards
\newcommand{\JPD}{{\it J. Phys. D: Appl. Phys.} }
\newcommand{\JPE}{{\it J. Phys. E: Sci. Instrum.} }
\newcommand{\JPF}{{\it J. Phys. F: Met. Phys.} }
\newcommand{\JPG}{{\it J. Phys. G: Nucl. Phys.} } %1975--1988
\newcommand{\jpg}{{\it J. Phys. G: Nucl. Part. Phys.} } %1989 and onwards
\newcommand{\MSMSE}{{\it Modelling Simulation Mater. Sci. Eng.} }
\newcommand{\MST}{{\it Meas. Sci. Technol.} } %1990 and onwards
\newcommand{\NET}{{\it Network: Comput. Neural Syst.} }
\newcommand{\NJP}{{\it New J. Phys.} }
\newcommand{\NL}{{\it Nonlinearity\/} }
\newcommand{\NT}{{\it Nanotechnology} }
\newcommand{\PAO}{{\it Pure Appl. Optics\/} }
\newcommand{\PM}{{\it Physiol. Meas.} } % added 4/5/93
\newcommand{\PMB}{{\it Phys. Med. Biol.} }
\newcommand{\PPCF}{{\it Plasma Phys. Control. Fusion\/} } % added 4/5/93
\newcommand{\PSST}{{\it Plasma Sources Sci. Technol.} }
\newcommand{\PUS}{{\it Public Understand. Sci.} }
\newcommand{\QO}{{\it Quantum Opt.} }
\newcommand{\QSO}{{\em Quantum Semiclass. Opt.} }
\newcommand{\RPP}{{\it Rep. Prog. Phys.} }
\newcommand{\SLC}{{\it Sov. Lightwave Commun.} } % added 4/5/93
\newcommand{\SST}{{\it Semicond. Sci. Technol.} }
\newcommand{\SUST}{{\it Supercond. Sci. Technol.} }
\newcommand{\WRM}{{\it Waves Random Media\/} }
\newcommand{\JMM}{{\it J. Micromech. Microeng.\/} }
%
% Other commonly quoted journals
%
\newcommand{\AC}{{\it Acta Crystallogr.} }
\newcommand{\AM}{{\it Acta Metall.} }
\newcommand{\AP}{{\it Ann. Phys., Lpz.} }
\newcommand{\APNY}{{\it Ann. Phys., NY\/} }
\newcommand{\APP}{{\it Ann. Phys., Paris\/} }
\newcommand{\CJP}{{\it Can. J. Phys.} }
\newcommand{\JAP}{{\it J. Appl. Phys.} }
\newcommand{\JCP}{{\it J. Chem. Phys.} }
\newcommand{\JJAP}{{\it Japan. J. Appl. Phys.} }
\newcommand{\JP}{{\it J. Physique\/} }
\newcommand{\JPhCh}{{\it J. Phys. Chem.} }
\newcommand{\JMMM}{{\it J. Magn. Magn. Mater.} }
\newcommand{\JMP}{{\it J. Math. Phys.} }
\newcommand{\JOSA}{{\it J. Opt. Soc. Am.} }
\newcommand{\JPSJ}{{\it J. Phys. Soc. Japan\/} }
\newcommand{\JQSRT}{{\it J. Quant. Spectrosc. Radiat. Transfer\/} }
\newcommand{\NC}{{\it Nuovo Cimento\/} }
\newcommand{\NIM}{{\it Nucl. Instrum. Methods\/} }
\newcommand{\NP}{{\it Nucl. Phys.} }
\newcommand{\PL}{{\it Phys. Lett.} }
\newcommand{\PR}{{\it Phys. Rev.} }
\newcommand{\PRL}{{\it Phys. Rev. Lett.} }
\newcommand{\PRS}{{\it Proc. R. Soc.} }
\newcommand{\PS}{{\it Phys. Scr.} }
\newcommand{\PSS}{{\it Phys. Status Solidi\/} }
\newcommand{\PTRS}{{\it Phil. Trans. R. Soc.} }
\newcommand{\RMP}{{\it Rev. Mod. Phys.} }
\newcommand{\RSI}{{\it Rev. Sci. Instrum.} }
\newcommand{\SSC}{{\it Solid State Commun.} }
\newcommand{\ZP}{{\it Z. Phys.} }
%===================
\pagestyle{headings}
\pagenumbering{arabic}
\raggedbottom
\onecolumn
\endinput
%%
%% End of file `jconf.cls'.
%%
%% This is file `jpconf11.clo'
%%
%% This file is distributed in the hope that it will be useful,
%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
%%
%% \CharacterTable
%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%% Digits \0\1\2\3\4\5\6\7\8\9
%% Exclamation \! Double quote \" Hash (number) \#
%% Dollar \$ Percent \% Ampersand \&
%% Acute accent \' Left paren \( Right paren \)
%% Asterisk \* Plus \+ Comma \,
%% Minus \- Point \. Solidus \/
%% Colon \: Semicolon \; Less than \<
%% Equals \= Greater than \> Question mark \?
%% Commercial at \@ Left bracket \[ Backslash \\
%% Right bracket \] Circumflex \^ Underscore \_
%% Grave accent \` Left brace \{ Vertical bar \|
%% Right brace \} Tilde \~}
\ProvidesFile{jpconf11.clo}[2005/05/04 v1.0 LaTeX2e file (size option)]
\renewcommand\normalsize{%
\@setfontsize\normalsize\@xipt{13}%
\abovedisplayskip 12\p@ \@plus3\p@ \@minus7\p@
\abovedisplayshortskip \z@ \@plus3\p@
\belowdisplayshortskip 6.5\p@ \@plus3.5\p@ \@minus3\p@
\belowdisplayskip \abovedisplayskip
\let\@listi\@listI}
\normalsize
\newcommand\small{%
\@setfontsize\small\@xpt{12}%
\abovedisplayskip 11\p@ \@plus3\p@ \@minus6\p@
\abovedisplayshortskip \z@ \@plus3\p@
\belowdisplayshortskip 6.5\p@ \@plus3.5\p@ \@minus3\p@
\def\@listi{\leftmargin\leftmargini
\topsep 9\p@ \@plus3\p@ \@minus5\p@
\parsep 4.5\p@ \@plus2\p@ \@minus\p@
\itemsep \parsep}%
\belowdisplayskip \abovedisplayskip}
\newcommand\footnotesize{%
% \@setfontsize\footnotesize\@xpt\@xiipt
\@setfontsize\footnotesize\@ixpt{11}%
\abovedisplayskip 10\p@ \@plus2\p@ \@minus5\p@
\abovedisplayshortskip \z@ \@plus3\p@
\belowdisplayshortskip 6\p@ \@plus3\p@ \@minus3\p@
\def\@listi{\leftmargin\leftmargini
\topsep 6\p@ \@plus2\p@ \@minus2\p@
\parsep 3\p@ \@plus2\p@ \@minus\p@
\itemsep \parsep}%
\belowdisplayskip \abovedisplayskip
}
\newcommand\scriptsize{\@setfontsize\scriptsize\@viiipt{9.5}}
\newcommand\tiny{\@setfontsize\tiny\@vipt\@viipt}
\newcommand\large{\@setfontsize\large\@xivpt{18}}
\newcommand\Large{\@setfontsize\Large\@xviipt{22}}
\newcommand\LARGE{\@setfontsize\LARGE\@xxpt{25}}
\newcommand\huge{\@setfontsize\huge\@xxvpt{30}}
\let\Huge=\huge
\if@twocolumn
\setlength\parindent{14\p@}
\else
\setlength\parindent{18\p@}
\fi
\if@letterpaper%
%\input{letmarg.tex}%
\setlength{\hoffset}{0mm}
\setlength{\marginparsep}{0mm}
\setlength{\marginparwidth}{0mm}
\setlength{\textwidth}{160mm}
\setlength{\oddsidemargin}{-0.4mm}
\setlength{\evensidemargin}{-0.4mm}
\setlength{\voffset}{0mm}
\setlength{\headheight}{8mm}
\setlength{\headsep}{5mm}
\setlength{\footskip}{0mm}
\setlength{\textheight}{230mm}
\setlength{\topmargin}{1.6mm}
\else
%\input{a4marg.tex}%
\setlength{\hoffset}{0mm}
\setlength{\marginparsep}{0mm}
\setlength{\marginparwidth}{0mm}
\setlength{\textwidth}{160mm}
\setlength{\oddsidemargin}{-0.4mm}
\setlength{\evensidemargin}{-0.4mm}
\setlength{\voffset}{0mm}
\setlength{\headheight}{8mm}
\setlength{\headsep}{5mm}
\setlength{\footskip}{0mm}
\setlength{\textheight}{230mm}
\setlength{\topmargin}{1.6mm}
\fi
\setlength\maxdepth{.5\topskip}
\setlength\@maxdepth\maxdepth
\setlength\footnotesep{8.4\p@}
\setlength{\skip\footins} {10.8\p@ \@plus 4\p@ \@minus 2\p@}
\setlength\floatsep {14\p@ \@plus 2\p@ \@minus 4\p@}
\setlength\textfloatsep {24\p@ \@plus 2\p@ \@minus 4\p@}
\setlength\intextsep {16\p@ \@plus 4\p@ \@minus 4\p@}
\setlength\dblfloatsep {16\p@ \@plus 2\p@ \@minus 4\p@}
\setlength\dbltextfloatsep{24\p@ \@plus 2\p@ \@minus 4\p@}
\setlength\@fptop{0\p@}
\setlength\@fpsep{10\p@ \@plus 1fil}
\setlength\@fpbot{0\p@}
\setlength\@dblfptop{0\p@}
\setlength\@dblfpsep{10\p@ \@plus 1fil}
\setlength\@dblfpbot{0\p@}
\setlength\partopsep{3\p@ \@plus 2\p@ \@minus 2\p@}
\def\@listI{\leftmargin\leftmargini
\parsep=\z@
\topsep=6\p@ \@plus3\p@ \@minus3\p@
\itemsep=3\p@ \@plus2\p@ \@minus1\p@}
\let\@listi\@listI
\@listi
\def\@listii {\leftmargin\leftmarginii
\labelwidth\leftmarginii
\advance\labelwidth-\labelsep
\topsep=3\p@ \@plus2\p@ \@minus\p@
\parsep=\z@
\itemsep=\parsep}
\def\@listiii{\leftmargin\leftmarginiii
\labelwidth\leftmarginiii
\advance\labelwidth-\labelsep
\topsep=\z@
\parsep=\z@
\partopsep=\z@
\itemsep=\z@}
\def\@listiv {\leftmargin\leftmarginiv
\labelwidth\leftmarginiv
\advance\labelwidth-\labelsep}
\def\@listv{\leftmargin\leftmarginv
\labelwidth\leftmarginv
\advance\labelwidth-\labelsep}
\def\@listvi {\leftmargin\leftmarginvi
\labelwidth\leftmarginvi
\advance\labelwidth-\labelsep}
\endinput
%%
%% End of file `iopart12.clo'.
\documentclass[a4paper]{jpconf}
\usepackage{url}
\usepackage{graphicx}
\usepackage{float}
\newcommand{\quotes}[1]{``#1''}
\begin{document}
\title{StoRM maintenance and evolution}
\author{
A. Ceccanti$^1$,
E. Vianello$^1$,
F. Giacomini$^1$
}
\address{$^1$ INFN-CNAF, Bologna, IT}
\ead{
andrea.ceccanti@cnaf.infn.it
}
\begin{abstract}
StoRM is the storage element solution that powers the CNAF Tier 1 data center as well as more than 30 other sites. In this contribution, we highlight the main maintenance and evolution activities on StoRM during 2018.
\end{abstract}
\section*{Introduction}
\label{sec:introduction}
StoRM~\cite{storm} is a lightweight storage resource manager (SRM) solution developed at INFN-CNAF which powers the CNAF Tier 1 data center as well as more than 30 other sites.
StoRM implements the SRM version 2.2~\cite{srm-2.2} data management specification and is typically deployed on top of a cluster file system like IBM GPFS~\cite{gpfs}.
StoRM has a layered architecture (Figure~\ref{fig:storm-arch}), split between two main components: the StoRM frontend and backend services.
The StoRM frontend service implements the SRM interface exposed
to client applications and frameworks.
The StoRM backend service implements the actual storage management logic by interacting directly with the underlying file system.
Communication between the frontend and the backend happens in two ways:
\begin{itemize}
\item via an XML-RPC api, for synchronous requests;
\item via a database, for asynchronous requests.
\end{itemize}
Data transfer is provided by GridFTP, HTTP and XRootD services accessing directly the file system underlying the StoRM deployment.
StoRM is interfaced with the IBM Tivoli Storage Manager (TSM) via GEMSS~\cite{gemss}, a component also developed at INFN, to provide optimized data archiving and tape recall functionality. The StoRM WebDAV service provides an alternative data management interface complementary to the SRM functionality, but which does not yet support tape operations.
An high level representation of the StoRM architecture is given in Figure~\ref{fig:storm-arch}.
During 2018, two StoRM releases where produced:
\begin{itemize}
\item StoRM 1.11.13~\cite{storm-1.11.13}, released on February, 19th, providing updates for the StoRM backend, YAIM module and the info provider;
\item StoRM 1.11.14~\cite{storm-1.11.14}, released on July, 25th, providing updates for the frontend and backend services, StoRM native and xmlrpc libraries, the GridFTP DSI module and the YAIM module.
\end{itemize}
The following paragraphs describe the main StoRM maintenance and evolution activities that resulted in the above releases and in pre-release packages made available to the CNAF Tier 1 and other interested sites during 2018.
\begin{figure}
\centering
\includegraphics[width=.6\textwidth]{storm-arch.png}
\caption{\label{fig:storm-arch}The StoRM high level architecture.}
\end{figure}
\section*{StoRM frontend stability improvements}
After observing repeated failures that resulted in the death of the StoRM frontend process in production at Tier 1, an investigation was started
to understand the cause of the failures and provide a fix to improve
the service stability.
The failures occurred mainly when an high number of requests was observed on the frontend. Enabling core dumping did not provide much information, besides the fact that the segfault occurred mostly in the XMLRPC serializiation/deserialization logic, and was likely caused by stack corruption. What precisely caused the stack corruption however was not
understood.
In order to contain the problem, the following improvements were
implemented:
\begin{itemize}
\item a configurable limit on the size of the request queue
on the frontend was implemented;
\item information about the request queue size and the number of
active requests was added to the frontend log, in order to monitor the queue processing status in real time;
\item the logic of the XMLRPC interaction between frontend and backend
has been refactored in order to use the xmlrpc synchronous API (the former use of the asynchronous API only complicated the code base without providing increased concurrency or throughput);
\item a configurable limit on the size of the threadpool serving XMLRPC requests has been introduced on the backend;
\item a configurable limit on the size of the queue of the XMLRPC requests has been introduced on the backend;
\item our load test suite was tuned to generate a load comparable with
the one observed in production for the ATLAS experiment.
\end{itemize}
These improvements, and appropriate configuration, restored the frontend
service stability: no more crashes were observed in production, even during peak load periods.
\section*{JSON storage usage record reporting}
In consultation with all the LHC experiments, the WLCG storage providers (dCache~\cite{dcache}, DPM~\cite{dpm}, EOS~\cite{eos}, StoRM, XRootD~\cite{xrootd}) drafted a proposal for storage resource reporting in WLCG~\cite{storage-resource-reporting-proposal}.
This document proposes five requirements:
\begin{itemize}
\item \texttt{R0}: storage systems should provide the total used space and the list of files stored (no other meta-data required);
\item \texttt{R1}: storage systems should provide the total used and total free space for all distinct space quotas available to the experiment through a non-SRM protocol (GridFTP, HTTP or XRootD) and with ten minutes as data freshness order and tens of GB as volume accuracy;
\item \texttt{R2}: storage systems should provide a public summary file indicating the “topology” of the system and usage information;
\item \texttt{R3}: storage systems should provide the total used and total free space on sub-directories, in particular any entity on which a restrictive quota has been applied;
\item \texttt{R4}: storage systems should provide a full storage dump with file information such as size, creation time and check-sum value.
\end{itemize}
Requirement \texttt{R3} has been withdrawn as no experiment supported its inclusion.
Requirement \texttt{R4} was already supported through WebDAV with a detailed and recursive \texttt{PROPFIND} operation.
In order to comply with the requirements \texttt{R0}, \texttt{R1} and \texttt{R2}, the following improvements were introduced in February 2018:
\begin{itemize}
\item the backend REST endpoint used to generate the list of configured storage areas and their usage status now produces a JSON response instead of plain text;
\item a new command, \texttt{get-report-json}, has been added to the info provider to generate a JSON site report file, with a configurable target location.
\end{itemize}
To fulfill requirement \texttt{R2}, the Tier 1 StoRM ATLAS production instance has been configured to expose,
via the StoRM WebDAV service, the JSON usage report in a storage area accessible by any client presenting a trusted X.509 certificate.
\section*{Backend improved starting logic}
Aiming to improve StoRM Backend service starting logic, an important re-factoring work has been done on the start-up source code and on the \texttt{init.d} scripts.
Before the re-factoring, each start-up of StoRM Backend service was divided into several running processes making even the kill of the service too much complex than necessary.
After the re-factoring only one process can be seen from command line and all the useless arguments has been removed. That has meant also a relevant improve of service start-up speed.
Comparing the start-up before the re-factoring:
\begin{verbatim}
$ time sh start-storm.sh
Bootstrapping storm-backend-server [ OK ]
Starting storm-backend-server [ OK ]
real 0m20.495s
user 0m0.122s
sys 0m0.140s
\end{verbatim}
and after:
\begin{verbatim}
$ time sh start-storm.sh
Starting storm-backend-server: [ OK ]
real 0m5.217s
user 0m0.083s
sys 0m0.078s
\end{verbatim}
we can see that the new boot speed is about 4 times faster.
\section*{WebDAV third-party transfers support}
At the end of May 2017 the Globus Alliance announced that the Open source
Globus toolkit would be no longer supported by the Globus team at the University of Chicago~\cite{globus-end-of-support}. This announcement had obvious impact on WLCG, since the Globus Security Infrastructure (GSI) and GridFTP lie at the core of the WLCG data management infrastructure, and discussions started in the appropriate forums on the search for alternatives. The DOMA Third party copy Working Group~\cite{doma-tpc} was established to investigate alternatives to the GridFTP protocol for bulk transfers across WLCG sites. This led to a requirement for all storage element implementations to support either WebDAV-based or XrootD-based third-party transfers.
In order to comply with the requirement, the following improvements were introduced in the StoRM WebDAV service in November 2018:
\begin{itemize}
\item The WebDAV service was migrated to the latest stable Spring boot libraries~\cite{spring-boot};
\item Token-based delegation and authorization was introduced, by adding support for external OpenID Connect~\cite{oidc} providers and by introducing an internal OAuth~\cite{oauth} authorization server that can be used to issue tokens to client authenticated with VOMS credentials;
\item the semantic of the WebDAV \texttt{COPY} method was extended to implement third-party transfers;
\item a significant refactoring of the robot test suite was implemented, by moving the test suite code in the server repository and simplifying credential management. The refactoring resulted in improved usability, performance and error reporting.
\end{itemize}
A pre-release package of the updated StoRM WebDAV package was
deployed at CNAF Tier 1 for the ATLAS WebDAV production instance and added successfully to the DOMA TPC testbed where it showed to work reliably.
The initial deployment also highlighted minor issues which were solved, and lead to the final release of the StoRM WebDAV 1.1.0 release in Februrary 2019.
\begin{figure}
\centering
\includegraphics[width=.6\textwidth]{tpc.png}
\caption{\label{fig:tpc}A WebDAV push-mode third-party transfer managed by CERN File Transfer Service (FTS) against two storage elements.}
\end{figure}
\section*{Conclusions and future work}
In this contribution, we presented the main development and evolution activities performed on StoRM during 2018. Besides ordinary maintenance, in 2019 we will focus on porting StoRM 1
to CENTOS 7 and in replacing the current YAIM-based configuration code~\cite{yaim} with a Puppet module~\cite{puppet}.
\section*{References}
\bibliographystyle{iopart-num}
\bibliography{biblio}
\end{document}
contributions/sd_storm/storm-arch.png

87.3 KiB

contributions/sd_storm/tpc.png

70.2 KiB

main.aux
main.bbl
main.blg
main.log
main.pdf
@misc{ref:spring,
title = {{The Spring framework}},
note = {\url{https://spring.io/}}
}
@misc{ref:keep-a-changelog,
title = {{Keep a Changelog}},
note = {\url{https://keepachangelog.com/en/1.0.0/}}
}
@inproceedings{ref:gemss,
title={{The Grid Enabled Mass Storage System (GEMSS): the Storage and Data management system used at the INFN Tier1 at CNAF}},
author={Ricci, Pier Paolo and Bonacorsi, Daniele and Cavalli, Alessandro and dell'Agnello, Luca and Gregori, Daniele and Prosperini, Andrea and Rinaldi, Lorenzo and Sapunenko, Vladimir and Vagnoni, Vincenzo},
booktitle={Journal of Physics: Conference Series},
volume={396},
pages={042051},
year={2012},
organization={IOP Publishing}
}
@misc{ref:srm,
title = {{The Storage Resource Manager Interface Specification,Version 2.2}},
year = 2009,
note = {\url{https://sdm.lbl.gov/srm-wg/doc/SRM.v2.2.html}}
}
@misc{ref:webdav,
title = {{HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)}},
year = 2007,
note = {\url{https://tools.ietf.org/html/rfc4918}}
}
@misc{ref:gitflow,
title = {{Gitflow Workflow}},
note = {\url{https://it.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow}},
urldate = {2019-07-08}
}
@misc{ref:grpc,
title = {{gRPC}},
note = {\url{https://grpc.io}},
urldate= {2019-07-05}
}
@misc{ref:protocol-buffers,
title = {{Protocol Buffers}},
note = {\url{https://developers.google.com/protocol-buffers/}},
urldate= {2019-07-05}
}
@misc{ref:rf,
title = {{Robot Framework}},
note = {\url{https://robotframework.org}},
urldate = {2019-07-05}
}
@misc{ref:docker,
title = {{Enterprise Container Platform for High-Velocity Innovation}},
note = {\url{https://www.docker.com}},
urldate = {2019-07-08}
}
@misc{ref:dc,
title = {{Docker Compose}},
note = {\url{https://docs.docker.com/compose}},
urldate = {2019-07-08}
}
@misc{ref:glcip,
title = {{Creating and using CI/CD pipelines}},
note = {\url{https://docs.gitlab.com/ee/ci/pipelines.html}},
urldate = {2019-07-08}
}
@misc{p1003.1e,
title = {{POSIX Access Control Lists, IEEE Draft P1003.1e}},
year = 1997
}
@InCollection{ref:nginx-voms,
author = {Ceccanti, Andrea and Giacomini, Francesco and Ronchieri, Elisabetta and Terranova, Nicholas},
title = {{A VOMS module for the Nginx web server}},
booktitle = {2018 CNAF Annual Report},
publisher = {INFN-CNAF},
year = 2019,
note = {\url{https://www.cnaf.infn.it/annual-report}}}
@Misc{ref:boost.fs,
title = {{Boost Filesystem}},
note = {\url{https://www.boost.org/doc/libs/release/libs/filesystem}}}
@Misc{ref:boost.log,
author = {Semashev, Andrey},
title = {{Boost Log}},
note = {\url{https://www.boost.org/doc/libs/release/libs/log}}}
@Misc{ref:yaml-cpp,
author = {Beder, Jesse},
title = {yaml-cpp},
note = {\url{https://github.com/jbeder/yaml-cpp}}}
@techreport{jwt,
author = {Michael B. Jones and John Bradley and Nat Sakimura},
title = {{The JSON Web Token RFC}},
type = {RFC},
number = 7519,
year = {2015},
month = {May},
issn = {2070-1721},
publisher = {IETF Tools},
institution = {IETF Tools},
url = {https://tools.ietf.org/rfc/rfc7519.txt}
}
@techreport{oauth,
author = {Dick Hardt},
title = {{The OAuth 2.0 Authorization Framework}},
type = {RFC},
number = 6749,
year = {2012},
month = {October},
issn = {2070-1721},
publisher = {IETF Tools},
institution = {IETF Tools},
url = {https://tools.ietf.org/rfc/rfc6749.txt}
}
@techreport{oauth-token-exchange,
author = {Michael B. Jones and Anthony Nadalin and Brian Campbell
and John Bradley and Chuck Mortimore},
title = {{OAuth 2.0 Token Exchange}},
type = {Internet-Draft},
number = "draft-ietf-oauth-token-exchange-16.txt",
year = {2019},
month = {April},
day = {22},
institution = {IETF Tools},
url = {https://tools.ietf.org/id/draft-ietf-oauth-token-exchange-16.txt}
}
@techreport{oauth-metadata,
author = {Michael B. Jones and Nat Sakimura and John Bradley},
title = {{OAuth 2.0 Authorization Server Metadata}},
type = {RFC},
number = 8414,
year = {2018},
month = {June},
issn = {2070-1721},
publisher = {IETF Tools},
institution = {IETF Tools},
url = {https://tools.ietf.org/rfc/rfc8414.txt}
}
@misc{oidc,
author = {{OpenID Foundation}},
title = {{The OpenID Connect identity layer}},
year = 2018,
note = {\url{https://openid.net/connect/}},
urldate = {2018-12-03}
}
@misc{oidc-discovery,
author = {{Nat Sakimura and John Bradley and Michael B. Jones and Edmund Jay}},
title = {{The OpenID Connect discovery specification}},
year = 2014,
note = {\url{https://openid.net/specs/openid-connect-discovery-1_0.html}},
urldate = {2018-12-03}
}
@misc{igtf,
title = {{The Interoperable Global Trust Federation}},
note = {\url{https://www.igtf.net/}},
urldate = {2018-12-03}
}
@misc{x509,
title = {{X.509}},
note = {\url{https://en.wikipedia.org/wiki/X.509}},
urldate = {2018-12-03}
}
@article{GSI,
author = {Von Welch and
Frank Siebenlist and
Ian T. Foster and
John Bresnahan and
Karl Czajkowski and
Jarek Gawor and
Carl Kesselman and
Sam Meder and
Laura Pearlman and
Steven Tuecke},
title = {Security for Grid Services},
journal = {CoRR},
volume = {cs.CR/0306129},
year = {2003},
url = {http://arxiv.org/abs/cs.CR/0306129},
timestamp = {Mon, 13 Aug 2018 16:49:07 +0200},
biburl = {https://dblp.org/rec/bib/journals/corr/cs-CR-0306129},
bibsource = {dblp computer science bibliography, https://dblp.org}
}
@software{VOMS,
author = {Vincenzo Ciaschini and Valerio Venturi and Andrea Ceccanti},
title = {{The Virtual Organisation Membership Service}},
doi = {10.5281/zenodo.1875371},
url = {https://doi.org/10.5281/zenodo.1875371}
}
@misc{edugain,
title = {{eduGAIN interfederation website}},
note = {\url{http://www.geant.org/Services/Trust_identity_and_security/eduGAIN}},
urldate = {2018-12-03}
}
@misc{google,
title = {{The Google Identity Platform}},
note = {\url{https://developers.google.com/identity/}},
urldate = {2018-12-03}
}
@misc{scim,
title = {{The System for Cross Domain Identity Management website}},
note = {\url{http://www.simplecloud.info/}},
urldate = {2018-12-03}
}
@article{indigo-aai-chep2016,
author={Andrea Ceccanti and Marcus Hardt and Bas Wegh and A. Paul Millar
and Marco Caberletti and Enrico Vianello and Slavek Licehammer},
title={{The INDIGO-Datacloud Authentication and Authorization Infrastructure}},
journal={Journal of Physics: Conference Series},
volume={898},
number={10},
pages={102016},
url={http://iopscience.iop.org/article/10.1088/1742-6596/898/10/102016},
year={2017}
}
@software{iam,
author = {Andrea Ceccanti and Enrico Vianello and Marco Caberletti},
title = {{INDIGO Identity and Access Management (IAM)}},
doi = {10.5281/zenodo.1874790},
url = {https://doi.org/10.5281/zenodo.1874790}
}
@software{voms-admin,
author = {Andrea Ceccanti},
title = {{The VOMS administration service}},
doi = {10.5281/zenodo.1875616},
url = {https://doi.org/10.5281/zenodo.1875616}
}
@misc{cwp,
Author = {{HEP Software Foundation} and Johannes Albrecht and Antonio
Augusto {Alves} Jr and Guilherme Amadio and Giuseppe Andronico and Nguyen
Anh-Ky and Laurent Aphecetche and John Apostolakis and Makoto Asai and Luca
Atzori and Marian Babik and Giuseppe Bagliesi and Marilena Bandieramonte
and Sunanda Banerjee and Martin Barisits and Lothar A. T. Bauerdick and
Stefano Belforte and Douglas Benjamin and Catrin Bernius and Wahid Bhimji
and Riccardo Maria Bianchi and Ian Bird and Catherine Biscarat and Jakob
Blomer and Kenneth Bloom and Tommaso Boccali and Brian Bockelman and Tomasz
Bold and Daniele Bonacorsi and Antonio Boveia and Concezio Bozzi and Marko
Bracko and David Britton and Andy Buckley and Predrag Buncic and Paolo
Calafiura and Simone Campana and Philippe Canal and Luca Canali and
Gianpaolo Carlino and Nuno Castro and Marco Cattaneo and Gianluca Cerminara
and Javier Cervantes Villanueva and Philip Chang and John Chapman and Gang
Chen and Taylor Childers and Peter Clarke and Marco Clemencic and Eric
Cogneras and Jeremy Coles and Ian Collier and David Colling and Gloria
Corti and Gabriele Cosmo and Davide Costanzo and Ben Couturier and Kyle
Cranmer and Jack Cranshaw and Leonardo Cristella and David Crooks and
Sabine Crépé-Renaudin and Robert Currie and Sünje Dallmeier-Tiessen and
Kaushik De and Michel De Cian and Albert De Roeck and Antonio Delgado Peris
and Frédéric Derue and Alessandro Di Girolamo and Salvatore Di Guida and
Gancho Dimitrov and Caterina Doglioni and Andrea Dotti and Dirk Duellmann
and Laurent Duflot and Dave Dykstra and Katarzyna Dziedziniewicz-Wojcik and
Agnieszka Dziurda and Ulrik Egede and Peter Elmer and Johannes Elmsheuser
and V. Daniel Elvira and Giulio Eulisse and Steven Farrell and Torben
Ferber and Andrej Filipcic and Ian Fisk and Conor Fitzpatrick and José Flix
and Andrea Formica and Alessandra Forti and Giovanni Franzoni and James
Frost and Stu Fuess and Frank Gaede and Gerardo Ganis and Robert Gardner
and Vincent Garonne and Andreas Gellrich and Krzysztof Genser and Simon
George and Frank Geurts and Andrei Gheata and Mihaela Gheata and Francesco
Giacomini and Stefano Giagu and Manuel Giffels and Douglas Gingrich and
Maria Girone and Vladimir V. Gligorov and Ivan Glushkov and Wesley Gohn and
Jose Benito Gonzalez Lopez and Isidro González Caballero and Juan R.
González Fernández and Giacomo Govi and Claudio Grandi and Hadrien Grasland
and Heather Gray and Lucia Grillo and Wen Guan and Oliver Gutsche and
Vardan Gyurjyan and Andrew Hanushevsky and Farah Hariri and Thomas Hartmann
and John Harvey and Thomas Hauth and Benedikt Hegner and Beate Heinemann
and Lukas Heinrich and Andreas Heiss and José M. Hernández and Michael
Hildreth and Mark Hodgkinson and Stefan Hoeche and Burt Holzman and Peter
Hristov and Xingtao Huang and Vladimir N. Ivanchenko and Todor Ivanov and
Jan Iven and Brij Jashal and Bodhitha Jayatilaka and Roger Jones and Michel
Jouvin and Soon Yung Jun and Michael Kagan and Charles William Kalderon and
Meghan Kane and Edward Karavakis and Daniel S. Katz and Dorian Kcira and
Oliver Keeble and Borut Paul Kersevan and Michael Kirby and Alexei
Klimentov and Markus Klute and Ilya Komarov and Dmitri Konstantinov and
Patrick Koppenburg and Jim Kowalkowski and Luke Kreczko and Thomas Kuhr and
Robert Kutschke and Valentin Kuznetsov and Walter Lampl and Eric Lancon and
David Lange and Mario Lassnig and Paul Laycock and Charles Leggett and
James Letts and Birgit Lewendel and Teng Li and Guilherme Lima and Jacob
Linacre and Tomas Linden and Miron Livny and Giuseppe Lo Presti and
Sebastian Lopienski and Peter Love and Adam Lyon and Nicolò Magini and
Zachary L. Marshall and Edoardo Martelli and Stewart Martin-Haugh and Pere
Mato and Kajari Mazumdar and Thomas McCauley and Josh McFayden and Shawn
McKee and Andrew McNab and Rashid Mehdiyev and Helge Meinhard and Dario
Menasce and Patricia Mendez Lorenzo and Alaettin Serhan Mete and Michele
Michelotto and Jovan Mitrevski and Lorenzo Moneta and Ben Morgan and
Richard Mount and Edward Moyse and Sean Murray and Armin Nairz and Mark S.
Neubauer and Andrew Norman and Sérgio Novaes and Mihaly Novak and Arantza
Oyanguren and Nurcan Ozturk and Andres Pacheco Pages and Michela Paganini
and Jerome Pansanel and Vincent R. Pascuzzi and Glenn Patrick and Alex
Pearce and Ben Pearson and Kevin Pedro and Gabriel Perdue and Antonio
Perez-Calero Yzquierdo and Luca Perrozzi and Troels Petersen and Marko
Petric and Andreas Petzold and Jónatan Piedra and Leo Piilonen and Danilo
Piparo and Jim Pivarski and Witold Pokorski and Francesco Polci and Karolos
Potamianos and Fernanda Psihas and Albert Puig Navarro and Günter Quast and
Gerhard Raven and Jürgen Reuter and Alberto Ribon and Lorenzo Rinaldi and
Martin Ritter and James Robinson and Eduardo Rodrigues and Stefan Roiser
and David Rousseau and Gareth Roy and Grigori Rybkine and Andre Sailer and
Tai Sakuma and Renato Santana and Andrea Sartirana and Heidi Schellman and
Jaroslava Schovancová and Steven Schramm and Markus Schulz and Andrea
Sciabà and Sally Seidel and Sezen Sekmen and Cedric Serfon and Horst
Severini and Elizabeth Sexton-Kennedy and Michael Seymour and Davide
Sgalaberna and Illya Shapoval and Jamie Shiers and Jing-Ge Shiu and Hannah
Short and Gian Piero Siroli and Sam Skipsey and Tim Smith and Scott Snyder
and Michael D. Sokoloff and Panagiotis Spentzouris and Hartmut Stadie and
Giordon Stark and Gordon Stewart and Graeme A. Stewart and Arturo Sánchez
and Alberto Sánchez-Hernández and Anyes Taffard and Umberto Tamponi and
Jeff Templon and Giacomo Tenaglia and Vakhtang Tsulaia and Christopher
Tunnell and Eric Vaandering and Andrea Valassi and Sofia Vallecorsa and
Liviu Valsan and Peter Van Gemmeren and Renaud Vernet and Brett Viren and
Jean-Roch Vlimant and Christian Voss and Margaret Votava and Carl Vuosalo
and Carlos Vázquez Sierra and Romain Wartel and Gordon T. Watts and Torre
Wenaus and Sandro Wenzel and Mike Williams and Frank Winklmeier and
Christoph Wissing and Frank Wuerthwein and Benjamin Wynne and Zhang Xiaomei
and Wei Yang and Efe Yazgan}, Title = {{A Roadmap for HEP Software and
Computing R\&D for the 2020s}}, Year = {2017}, Eprint = {arXiv:1712.06982},
}
@misc{scitokens,
title = {{The SciTokens project}},
note = {\url{https://scitokens.org}},
urldate = {2018-12-03}
}
@misc{kubernetes,
title = {{The Kubernetes container orchestrator}},
note = {\url{https://kubernetes.io}},
urldate = {2018-12-03}
}
@misc{openstack,
title = {{The Openstack IAAS framework}},
note = {\url{https://www.openstack.org}},
urldate = {2018-12-03}
}
@misc{fts,
title = {{The CERN File Transfer Service}},
note = {\url{https://fts.web.cern.ch}},
urldate = {2018-12-03}
}
@misc{storm,
title = {{The StoRM storage element}},
note = {\url{https://italiangrid.github.io/storm}},
urldate = {2018-12-03}
}
@misc{dcache,
title = {{The dCache storage solution}},
note = {\url{https://dcache.org}},
urldate = {2018-12-03}
}
@misc{oidc-rande,
title = {{The OpenID Research \& Education working group}},
note = {\url{https://openid.net/wg/rande}},
urldate = {2018-12-03}
}
@techreport{voms-ac-format,
author = {Vincenzo Ciaschini and Valerio Venturi and Andrea Ceccanti},
title = {{The VOMS Attribute Certificate format }},
year = {2011},
month = {August},
publisher = {Open Grid Forum},
institution = {Open Grid Forum},
url = {https://www.ogf.org/documents/GFD.182.pdf}
}
@misc{aarc-blueprint,
title = {{The AARC Blueprint Architecture}},
note = {\url{https://aarc-project.eu/architecture}},
urldate = {2018-12-03}
}
@misc{rcauth-ssh,
title = {{RCAuth.eu: getting proxies using SSH key AuthN}},
author = {Mischa Sall\'e},
note = {\url{https://indico.cern.ch/event/669715/contributions/2739035/attachments/1532101/2398499/RCauth_SSH_wlcg_authz_wg.pdf}},
urldate = {2018-12-03}
}
@misc{oauth4myproxy,
title = {{OAuth for MyProxy}},
note = {\url{http://grid.ncsa.illinois.edu/myproxy/oauth/}},
urldate = {2019-03-18}
}
@misc{rcauth,
title = {{The RCAuth online CA}},
note = {\url{https://rcauth.eu}},
urldate = {2018-12-03}
}
@misc{dodas,
title = {{Dynamic On Demand Analysis Service: DODAS}},
note = {\url{https://dodas-ts.github.io/dodas-doc}},
urldate = {2018-12-03}
}
@misc{eosc-hub,
title = {{The EOSC-Hub project}},
note = {\url{https://www.eosc-hub.eu}},
urldate = {2018-12-03}
}
@misc{aarc,
title = {{The AARC project}},
note = {\url{https://aarc-project.eu}},
urldate = {2018-12-03}
}
@misc{fim4r,
title = {{Federated Identity Management for Research}},
note = {\url{https://fim4r.org}},
urldate = {2018-12-03}
}
@misc{wlcg-authz-wg,
title = {{The WLCG Authorization Working Group}},
note = {\url{https://twiki.cern.ch/twiki/bin/view/LCG/WLCGAuthorizationWG}},
urldate = {2018-12-03}
}
@misc{nikhef,
title = {{The Dutch National Insititute for Sub-atomic Physics}},
note = {\url{https://www.nikhef.nl}},
urldate = {2019-5-10}
}
@misc{indigo-datacloud,
Author = {INDIGO-DataCloud Collaboration and : and Davide Salomoni and Isabel
Campos and Luciano Gaido and Jesus Marco de Lucas and Peter Solagna and Jorge
Gomes and Ludek Matyska and Patrick Fuhrman and Marcus Hardt and Giacinto
Donvito and Lukasz Dutka and Marcin Plociennik and Roberto Barbera and
Ignacio Blanquer and Andrea Ceccanti and Mario David and Cristina Duma and
Alvaro López-García and Germán Moltó and Pablo Orviz and Zdenek Sustr and
Matthew Viljoen and Fernando Aguilar and Luis Alves and Marica Antonacci
and Lucio Angelo Antonelli and Stefano Bagnasco and Alexandre M. J. J.
Bonvin and Riccardo Bruno and Eva Cetinic and Yin Chen and Alessandro Costa
and Davor Davidovic and Benjamin Ertl and Marco Fargetta and Sandro Fiore
and Stefano Gallozzi and Zeynep Kurkcuoglu and Lara Lloret and Joao Martins
and Alessandra Nuzzo and Paola Nassisi and Cosimo Palazzo and Joao Pina and
Eva Sciacca and Daniele Spiga and Marco Antonio Tangaro and Michal Urbaniak
and Sara Vallero and Bas Wegh and Valentina Zaccolo and Federico Zambelli
and Tomasz Zok},
Title = {{INDIGO-DataCloud:A data and computing platform to facilitate seamless
access to e-infrastructures}},
Year = {2017},
Eprint = {arXiv:1711.01981},
}
@misc{kubernetes-labels,
title = {{Kubernetes labels and selectors}},
note = {\url{https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/}},
urldate = {2018-12-03}
}
@misc{spid,
title = {{Sistema Pubblico di Identità Digitale}},
note = {\url{https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/}},
urldate = {2018-12-03}
}
@misc{hr-db-api-service,
title = {{CERN HR DB API service }},
note = {\url{https://baltig.infn.it/aceccant/cern-hr-db-service}},
urldate = {2018-12-03}
}
@misc{cern-openshift,
title = {{CERN Openshift PAAS infrastructure}},
note = {\url{http://information-technology.web.cern.ch/services/PaaS-Web-App}},
urldate = {2018-12-03}
}
@misc{keycloak,
title = {{The Keycloak Identity and Access Management system}},
note = {\url{https://www.keycloak.org/}},
urldate = {2018-12-03}
}
@inproceedings{cern-sso,
doi = {10.1088/1742-6596/119/8/082008},
url = {https://doi.org/10.1088%2F1742-6596%2F119%2F8%2F082008},
year = 2008,
volume = {119},
number = {8},
pages = {082008},
author = {E Ormancey},
title = {{CERN} single sign on solution},
booktitle = {Journal of Physics: Conference Series}
}
@inproceedings{voms-convergence,
author={Andrea Ceccanti and Vincenzo Ciaschini and Maria Dimou and Gabriele Garzoglio and Tanya Levshina and Steve Traylen and Valerio Venturi},
title={{VOMS/VOMRS utilization patterns and convergence plan}},
booktitle={Journal of Physics: Conference Series},
volume={219},
number={6},
pages={062006},
url={http://stacks.iop.org/1742-6596/219/i=6/a=062006},
year={2010}
}
contributions/sd_storm2/high-level-arch.png

65.5 KiB

%%
%% This is file `iopams.sty'
%% File to include AMS fonts and extra definitions for bold greek
%% characters for use with iopart.cls
%%
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{iopams}[1997/02/13 v1.0]
\RequirePackage{amsgen}[1995/01/01]
\RequirePackage{amsfonts}[1995/01/01]
\RequirePackage{amssymb}[1995/01/01]
\RequirePackage{amsbsy}[1995/01/01]
%
\iopamstrue % \newif\ifiopams in iopart.cls & iopbk2e.cls
% % allows optional text to be in author guidelines
%
% Bold lower case Greek letters
%
\newcommand{\balpha}{\boldsymbol{\alpha}}
\newcommand{\bbeta}{\boldsymbol{\beta}}
\newcommand{\bgamma}{\boldsymbol{\gamma}}
\newcommand{\bdelta}{\boldsymbol{\delta}}
\newcommand{\bepsilon}{\boldsymbol{\epsilon}}
\newcommand{\bzeta}{\boldsymbol{\zeta}}
\newcommand{\bfeta}{\boldsymbol{\eta}}
\newcommand{\btheta}{\boldsymbol{\theta}}
\newcommand{\biota}{\boldsymbol{\iota}}
\newcommand{\bkappa}{\boldsymbol{\kappa}}
\newcommand{\blambda}{\boldsymbol{\lambda}}
\newcommand{\bmu}{\boldsymbol{\mu}}
\newcommand{\bnu}{\boldsymbol{\nu}}
\newcommand{\bxi}{\boldsymbol{\xi}}
\newcommand{\bpi}{\boldsymbol{\pi}}
\newcommand{\brho}{\boldsymbol{\rho}}
\newcommand{\bsigma}{\boldsymbol{\sigma}}
\newcommand{\btau}{\boldsymbol{\tau}}
\newcommand{\bupsilon}{\boldsymbol{\upsilon}}
\newcommand{\bphi}{\boldsymbol{\phi}}
\newcommand{\bchi}{\boldsymbol{\chi}}
\newcommand{\bpsi}{\boldsymbol{\psi}}
\newcommand{\bomega}{\boldsymbol{\omega}}
\newcommand{\bvarepsilon}{\boldsymbol{\varepsilon}}
\newcommand{\bvartheta}{\boldsymbol{\vartheta}}
\newcommand{\bvaromega}{\boldsymbol{\varomega}}
\newcommand{\bvarrho}{\boldsymbol{\varrho}}
\newcommand{\bvarzeta}{\boldsymbol{\varsigma}} %NB really sigma
\newcommand{\bvarsigma}{\boldsymbol{\varsigma}}
\newcommand{\bvarphi}{\boldsymbol{\varphi}}
%
% Bold upright capital Greek letters
%
\newcommand{\bGamma}{\boldsymbol{\Gamma}}
\newcommand{\bDelta}{\boldsymbol{\Delta}}
\newcommand{\bTheta}{\boldsymbol{\Theta}}
\newcommand{\bLambda}{\boldsymbol{\Lambda}}
\newcommand{\bXi}{\boldsymbol{\Xi}}
\newcommand{\bPi}{\boldsymbol{\Pi}}
\newcommand{\bSigma}{\boldsymbol{\Sigma}}
\newcommand{\bUpsilon}{\boldsymbol{\Upsilon}}
\newcommand{\bPhi}{\boldsymbol{\Phi}}
\newcommand{\bPsi}{\boldsymbol{\Psi}}
\newcommand{\bOmega}{\boldsymbol{\Omega}}
%
% Bold versions of miscellaneous symbols
%
\newcommand{\bpartial}{\boldsymbol{\partial}}
\newcommand{\bell}{\boldsymbol{\ell}}
\newcommand{\bimath}{\boldsymbol{\imath}}
\newcommand{\bjmath}{\boldsymbol{\jmath}}
\newcommand{\binfty}{\boldsymbol{\infty}}
\newcommand{\bnabla}{\boldsymbol{\nabla}}
\newcommand{\bdot}{\boldsymbol{\cdot}}
%
% Symbols for caption
%
\renewcommand{\opensquare}{\mbox{$\square$}}
\renewcommand{\opentriangle}{\mbox{$\vartriangle$}}
\renewcommand{\opentriangledown}{\mbox{$\triangledown$}}
\renewcommand{\opendiamond}{\mbox{$\lozenge$}}
\renewcommand{\fullsquare}{\mbox{$\blacksquare$}}
\newcommand{\fulldiamond}{\mbox{$\blacklozenge$}}
\newcommand{\fullstar}{\mbox{$\bigstar$}}
\newcommand{\fulltriangle}{\mbox{$\blacktriangle$}}
\newcommand{\fulltriangledown}{\mbox{$\blacktriangledown$}}
\endinput
%%
%% End of file `iopams.sty'.
\NeedsTeXFormat{LaTeX2e}[1995/12/01]
\ProvidesClass{jpconf}
[2007/03/07 v1.1
LaTeX class for Journal of Physics: Conference Series]
%\RequirePackage{graphicx}
\newcommand\@ptsize{1}
\newif\if@restonecol
\newif\if@letterpaper
\newif\if@titlepage
\newif\ifiopams
\@titlepagefalse
\@letterpaperfalse
\DeclareOption{a4paper}
{\setlength\paperheight {297mm}%
\setlength\paperwidth {210mm}%
\@letterpaperfalse}
\DeclareOption{letterpaper}
{\setlength\paperheight {279.4mm}%
\setlength\paperwidth {215.9mm}%
\@letterpapertrue}
\DeclareOption{landscape}
{\setlength\@tempdima {\paperheight}%
\setlength\paperheight {\paperwidth}%
\setlength\paperwidth {\@tempdima}}
\DeclareOption{twoside}{\@twosidetrue \@mparswitchtrue}
\renewcommand\@ptsize{1}
%\ExecuteOptions{A4paper, twoside}
\ExecuteOptions{A4paper}
\ProcessOptions
\DeclareMathAlphabet{\bi}{OML}{cmm}{b}{it}
\DeclareMathAlphabet{\bcal}{OMS}{cmsy}{b}{n}
\input{jpconf1\@ptsize.clo}
\setlength\lineskip{1\p@}
\setlength\normallineskip{1\p@}
\renewcommand\baselinestretch{}
\setlength\parskip{0\p@ \@plus \p@}
\@lowpenalty 51
\@medpenalty 151
\@highpenalty 301
\setlength\parindent{5mm}
\setcounter{topnumber}{8}
\renewcommand\topfraction{1}
\setcounter{bottomnumber}{3}
\renewcommand\bottomfraction{.99}
\setcounter{totalnumber}{8}
\renewcommand\textfraction{0.01}
\renewcommand\floatpagefraction{.8}
\setcounter{dbltopnumber}{6}
\renewcommand\dbltopfraction{1}
\renewcommand\dblfloatpagefraction{.8}
\renewcommand{\title}{\@ifnextchar[{\@stitle}{\@ftitle}}
\pretolerance=5000
\tolerance=8000
% Headings for all pages apart from first
%
\def\ps@headings{%
\let\@oddfoot\@empty
\let\@evenfoot\@empty
\let\@oddhead\@empty
\let\@evenhead\@empty
%\def\@evenhead{\thepage\hfil\itshape\rightmark}%
%\def\@oddhead{{\itshape\leftmark}\hfil\thepage}%
%\def\@evenhead{{\itshape Journal of Physics: Conference Series}\hfill}%
%\def\@oddhead{\hfill {\itshape Journal of Physics: Conference Series}}%%
\let\@mkboth\markboth
\let\sectionmark\@gobble
\let\subsectionmark\@gobble}
%
% Headings for first page
%
\def\ps@myheadings{\let\@oddfoot\@empty\let\@evenfoot\@empty
\let\@oddhead\@empty\let\@evenhead\@empty
\let\@mkboth\@gobbletwo
\let\sectionmark\@gobble
\let\subsectionmark\@gobble}
%
\def\@stitle[#1]#2{\markboth{#1}{#1}%
%\pagestyle{empty}%
\thispagestyle{myheadings}
\vspace*{25mm}{\exhyphenpenalty=10000\hyphenpenalty=10000
%\Large
\fontsize{18bp}{24bp}\selectfont\bf\raggedright\noindent#2\par}}
\def\@ftitle#1{\markboth{#1}{#1}%
\thispagestyle{myheadings}
%\pagestyle{empty}%
\vspace*{25mm}{\exhyphenpenalty=10000\hyphenpenalty=10000
%\Large\raggedright\noindent\bf#1\par}
\fontsize{18bp}{24bp}\selectfont\bf\noindent\raggedright#1\par}}
%AUTHOR
\renewcommand{\author}{\@ifnextchar[{\@sauthor}{\@fauthor}}
\def\@sauthor[#1]#2{\markright{#1} % for production only
\vspace*{1.5pc}%
\begin{indented}%
\item[]\normalsize\bf\raggedright#2
\end{indented}%
\smallskip}
\def\@fauthor#1{%\markright{#1} for production only
\vspace*{1.5pc}%
\begin{indented}%
\item[]\normalsize\bf\raggedright#1
\end{indented}%
\smallskip}
%E-MAIL
\def\eads#1{\vspace*{5pt}\address{E-mail: #1}}
\def\ead#1{\vspace*{5pt}\address{E-mail: \mailto{#1}}}
\def\mailto#1{{\tt #1}}
%ADDRESS
\newcommand{\address}[1]{\begin{indented}
\item[]\rm\raggedright #1
\end{indented}}
\newlength{\indentedwidth}
\newdimen\mathindent
\mathindent = 6pc
\indentedwidth=\mathindent
% FOOTNOTES
%\renewcommand\footnoterule{%
% \kern-3\p@
% \hrule\@width.4\columnwidth
% \kern2.6\p@}
%\newcommand\@makefntext[1]{%
% \parindent 1em%
% \noindent
% \hb@xt@1.8em{\hss\@makefnmark}#1}
% Footnotes: symbols selected in same order as address indicators
% unless optional argument of [<num>] use to specify required symbol,
% 1=\dag, 2=\ddag, etc
% Usage: \footnote{Text of footnote}
% \footnote[3]{Text of footnote}
%
\def\footnoterule{}%
\setcounter{footnote}{0}
\long\def\@makefntext#1{\parindent 1em\noindent
\makebox[1em][l]{\footnotesize\rm$\m@th{\fnsymbol{footnote}}$}%
\footnotesize\rm #1}
\def\@makefnmark{\normalfnmark}
\def\normalfnmark{\hbox{${\fnsymbol{footnote}}\m@th$}}
\def\altfnmark{\hbox{$^{\rm Note}\ {\fnsymbol{footnote}}\m@th$}}
\def\footNote#1{\let\@makefnmark\altfnmark\footnote{#1}\let\@makefnmark\normalfnmark}
\def\@thefnmark{\fnsymbol{footnote}}
\def\footnote{\protect\pfootnote}
\def\pfootnote{\@ifnextchar[{\@xfootnote}{\stepcounter{\@mpfn}%
\begingroup\let\protect\noexpand
\xdef\@thefnmark{\thempfn}\endgroup
\@footnotemark\@footnotetext}}
\def\@xfootnote[#1]{\setcounter{footnote}{#1}%
\addtocounter{footnote}{-1}\footnote}
\newcommand\ftnote{\protect\pftnote}
\newcommand\pftnote[1]{\setcounter{footnote}{#1}%
\addtocounter{footnote}{-1}\footnote}
\newcommand{\fnm}[1]{\setcounter{footnote}{#1}\footnotetext}
\def\@fnsymbol#1{\ifnum\thefootnote=99\hbox{*}\else^{\thefootnote}\fi\relax}
%
% Address marker
%
\newcommand{\ad}[1]{\noindent\hbox{$^{#1}$}\relax}
\newcommand{\adnote}[2]{\noindent\hbox{$^{#1,}$}\setcounter{footnote}{#2}%
\addtocounter{footnote}{-1}\footnote}
\def\@tnote{}
\newcounter{oldftnote}
\newcommand{\tnote}[1]{*\gdef\@tnote{%
\setcounter{oldftnote}{\c@footnote}%
\setcounter{footnote}{99}%
\footnotetext{#1}%
\setcounter{footnote}{\c@oldftnote}\addtocounter{footnote}{-1}}}
%==================
% Acknowledgments (no heading if letter)
% Usage \ack for Acknowledgments, \ackn for Acknowledgement
\def\ack{\section*{Acknowledgments}}
\def\ackn{\section*{Acknowledgment}}
%SECTION DEFINITIONS
\setcounter{secnumdepth}{3}
\newcounter {section}
\newcounter {subsection}[section]
\newcounter {subsubsection}[subsection]
\newcounter {paragraph}[subsubsection]
\newcounter {subparagraph}[paragraph]
\renewcommand \thesection {\arabic{section}}
\renewcommand\thesubsection {\thesection.\arabic{subsection}}
\renewcommand\thesubsubsection{\thesubsection .\arabic{subsubsection}}
\renewcommand\theparagraph {\thesubsubsection.\arabic{paragraph}}
\renewcommand\thesubparagraph {\theparagraph.\arabic{subparagraph}}
%\nosections
\def\nosections{\vspace{30\p@ plus12\p@ minus12\p@}
\noindent\ignorespaces}
%\renewcommand{\@startsection}[6]
%{%
%\if@noskipsec \leavevmode \fi
%\par
% \@tempskipa #4\relax
%%\@tempskipa 0pt\relax
% \@afterindenttrue
% \ifdim \@tempskipa <\z@
% \@tempskipa -\@tempskipa \@afterindentfalse
% \fi
% \if@nobreak
% \everypar{}%
% \else
% \addpenalty\@secpenalty\addvspace\@tempskipa
% \fi
% \@ifstar
% {\@ssect{#3}{#4}{#5}{#6}}%
% {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}}
%\renewcommand{\@sect}[8]{%
% \ifnum #2>\c@secnumdepth
% \let\@svsec\@empty
% \else
% \refstepcounter{#1}%
% \protected@edef\@svsec{\@seccntformat{#1}\relax}%
% \fi
% \@tempskipa #5\relax
% \ifdim \@tempskipa>\z@
% \begingroup
% #6{%
% \@hangfrom{\hskip #3\relax\@svsec}%
% \interlinepenalty \@M #8\@@par}%
% \endgroup
% \csname #1mark\endcsname{#7}%
% \addcontentsline{toc}{#1}{%
% \ifnum #2>\c@secnumdepth \else
% \protect\numberline{\csname the#1\endcsname}%
% \fi
% #7}%
% \else
% \def\@svsechd{%
% #6{\hskip #3\relax
% \@svsec #8}%
% \csname #1mark\endcsname{#7}%
% \addcontentsline{toc}{#1}{%
% \ifnum #2>\c@secnumdepth \else
% \protect\numberline{\csname the#1\endcsname}%
% \fi
% #7}}%
% \fi
% \@xsect{#5}}
%\renewcommand{\@xsect}[1]{%
% \@tempskipa #1\relax
% \ifdim \@tempskipa>\z@
% \par \nobreak
% \vskip \@tempskipa
% \@afterheading
% \else
% \@nobreakfalse
% \global\@noskipsectrue
% \everypar{%
% \if@noskipsec
% \global\@noskipsecfalse
% {\setbox\z@\lastbox}%
% \clubpenalty\@M
% \begingroup \@svsechd \endgroup
% \unskip
% \@tempskipa #1\relax
% \hskip -\@tempskipa
% \else
% \clubpenalty \@clubpenalty
% \everypar{}%
% \fi}%
% \fi
% \ignorespaces}
%========================================================================
\newcommand\section{\@startsection {section}{1}{\z@}%
{-3.25ex\@plus -1ex \@minus -.2ex}%
{1sp}%
{\reset@font\normalsize\bfseries\raggedright}}
\newcommand\subsection{\@startsection{subsection}{2}{\z@}%
{-3.25ex\@plus -1ex \@minus -.2ex}%
{1sp}%
{\reset@font\normalsize\itshape\raggedright}}
\newcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}%
{-3.25ex\@plus -1ex \@minus -.2ex}%
{-1em \@plus .2em}%
{\reset@font\normalsize\itshape}}
\newcommand\paragraph{\@startsection{paragraph}{4}{\z@}%
{3.25ex \@plus1ex \@minus.2ex}%
{-1em}%
{\reset@font\normalsize\itshape}}
\newcommand\subparagraph{\@startsection{subparagraph}{5}{\parindent}%
{3.25ex \@plus1ex \@minus .2ex}%
{-1em}%
{\reset@font\normalsize\itshape}}
\def\@sect#1#2#3#4#5#6[#7]#8{\ifnum #2>\c@secnumdepth
\let\@svsec\@empty\else
\refstepcounter{#1}\edef\@svsec{\csname the#1\endcsname. }\fi
\@tempskipa #5\relax
\ifdim \@tempskipa>\z@
\begingroup #6\relax
\noindent{\hskip #3\relax\@svsec}{\interlinepenalty \@M #8\par}%
\endgroup
\csname #1mark\endcsname{#7}\addcontentsline
{toc}{#1}{\ifnum #2>\c@secnumdepth \else
\protect\numberline{\csname the#1\endcsname}\fi
#7}\else
\def\@svsechd{#6\hskip #3\relax %% \relax added 2 May 90
\@svsec #8\csname #1mark\endcsname
{#7}\addcontentsline
{toc}{#1}{\ifnum #2>\c@secnumdepth \else
\protect\numberline{\csname the#1\endcsname}\fi
#7}}\fi
\@xsect{#5}}
%
\def\@ssect#1#2#3#4#5{\@tempskipa #3\relax
\ifdim \@tempskipa>\z@
\begingroup #4\noindent{\hskip #1}{\interlinepenalty \@M #5\par}\endgroup
\else \def\@svsechd{#4\hskip #1\relax #5}\fi
\@xsect{#3}}
% LIST DEFINITIONS
\setlength\leftmargini {2em}
\leftmargin \leftmargini
\setlength\leftmarginii {2em}
\setlength\leftmarginiii {1.8em}
\setlength\leftmarginiv {1.6em}
\setlength\leftmarginv {1em}
\setlength\leftmarginvi {1em}
\setlength\leftmargin{\leftmargini}
\setlength \labelsep {.5em}
\setlength \labelwidth{\leftmargini}
\addtolength\labelwidth{-\labelsep}
\@beginparpenalty -\@lowpenalty
\@endparpenalty -\@lowpenalty
\@itempenalty -\@lowpenalty
\renewcommand\theenumi{\roman{enumi}}
\renewcommand\theenumii{\alph{enumii}}
\renewcommand\theenumiii{\arabic{enumiii}}
\renewcommand\theenumiv{\Alph{enumiv}}
\newcommand\labelenumi{(\theenumi)}
\newcommand\labelenumii{(\theenumii)}
\newcommand\labelenumiii{\theenumiii.}
\newcommand\labelenumiv{(\theenumiv)}
\renewcommand\p@enumii{(\theenumi)}
\renewcommand\p@enumiii{(\theenumi.\theenumii)}
\renewcommand\p@enumiv{(\theenumi.\theenumii.\theenumiii)}
\newcommand\labelitemi{$\m@th\bullet$}
\newcommand\labelitemii{\normalfont\bfseries --}
\newcommand\labelitemiii{$\m@th\ast$}
\newcommand\labelitemiv{$\m@th\cdot$}
\renewcommand \theequation {\@arabic\c@equation}
%%%%%%%%%%%%% Figures
\newcounter{figure}
\renewcommand\thefigure{\@arabic\c@figure}
\def\fps@figure{tbp}
\def\ftype@figure{1}
\def\ext@figure{lof}
\def\fnum@figure{\figurename~\thefigure}
\newenvironment{figure}{\footnotesize\rm\@float{figure}}%
{\end@float\normalsize\rm}
\newenvironment{figure*}{\footnotesize\rm\@dblfloat{figure}}{\end@dblfloat}
\newcounter{table}
\renewcommand\thetable{\@arabic\c@table}
\def\fps@table{tbp}
\def\ftype@table{2}
\def\ext@table{lot}
\def\fnum@table{\tablename~\thetable}
\newenvironment{table}{\footnotesize\rm\@float{table}}%
{\end@float\normalsize\rm}
\newenvironment{table*}{\footnotesize\rm\@dblfloat{table}}%
{\end@dblfloat\normalsize\rm}
\newlength\abovecaptionskip
\newlength\belowcaptionskip
\setlength\abovecaptionskip{10\p@}
\setlength\belowcaptionskip{0\p@}
%Table Environments
%\newenvironment{tableref}[3][\textwidth]{%
%\begin{center}%
%\begin{table}%
%\captionsetup[table]{width=#1}
%\centering\caption{\label{#2}#3}}{\end{table}\end{center}}
%%%%%%%%%%%%%%%%%
%\newcounter{figure}
%\renewcommand \thefigure {\@arabic\c@figure}
%\def\fps@figure{tbp}
%\def\ftype@figure{1}
%\def\ext@figure{lof}
%\def\fnum@figure{\figurename~\thefigure}
%ENVIRONMENT: figure
%\newenvironment{figure}
% {\@float{figure}}
% {\end@float}
%ENVIRONMENT: figure*
%\newenvironment{figure*}
% {\@dblfloat{figure}}
% {\end@dblfloat}
%ENVIRONMENT: table
%\newcounter{table}
%\renewcommand\thetable{\@arabic\c@table}
%\def\fps@table{tbp}
%\def\ftype@table{2}
%\def\ext@table{lot}
%\def\fnum@table{\tablename~\thetable}
%\newenvironment{table}
% {\@float{table}}
% {\end@float}
%ENVIRONMENT: table*
%\newenvironment{table*}
% {\@dblfloat{table}}
% {\end@dblfloat}
%\newlength\abovecaptionskip
%\newlength\belowcaptionskip
%\setlength\abovecaptionskip{10\p@}
%\setlength\belowcaptionskip{0\p@}
% CAPTIONS
% Added redefinition of \@caption so captions are not written to
% aux file therefore less need to \protect fragile commands
%
\long\def\@caption#1[#2]#3{\par\begingroup
\@parboxrestore
\normalsize
\@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par
\endgroup}
\long\def\@makecaption#1#2{%
\vskip\abovecaptionskip
\sbox\@tempboxa{{\bf #1.} #2}%
\ifdim \wd\@tempboxa >\hsize
{\bf #1.} #2\par
\else
\global \@minipagefalse
\hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
\fi
\vskip\belowcaptionskip}
\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm}
\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf}
\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt}
\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf}
\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit}
\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl}
\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc}
\DeclareRobustCommand*\cal{\@fontswitch\relax\mathcal}
\DeclareRobustCommand*\mit{\@fontswitch\relax\mathnormal}
%\newcommand\@pnumwidth{1.55em}
%\newcommand\@tocrmarg{2.55em}
%\newcommand\@dotsep{4.5}
%\setcounter{tocdepth}{3}
%\newcommand\tableofcontents{%
% \section*{\contentsname
% \@mkboth{%
% \MakeUppercase\contentsname}{\MakeUppercase\contentsname}}%
% \@starttoc{toc}%
% }
%\newcommand*\l@part[2]{%
% \ifnum \c@tocdepth >-2\relax
% \addpenalty\@secpenalty
% \addvspace{2.25em \@plus\p@}%
% \begingroup
% \parindent \z@ \rightskip \@pnumwidth
% \parfillskip -\@pnumwidth
% {\leavevmode
% \large \bfseries #1\hfil \hb@xt@\@pnumwidth{\hss #2}}\par
% \nobreak
% \if@compatibility
% \global\@nobreaktrue
% \everypar{\global\@nobreakfalse\everypar{}}%
% \fi
% \endgroup
% \fi}
%\newcommand*\l@section[2]{%
% \ifnum \c@tocdepth >\z@
% \addpenalty\@secpenalty
% \addvspace{1.0em \@plus\p@}%
% \setlength\@tempdima{1.5em}%
% \begingroup
% \parindent \z@ \rightskip \@pnumwidth
% \parfillskip -\@pnumwidth
% \leavevmode \bfseries
% \advance\leftskip\@tempdima
% \hskip -\leftskip
% #1\nobreak\hfil \nobreak\hb@xt@\@pnumwidth{\hss #2}\par
% \endgroup
% \fi}
%\newcommand*\l@subsection{\@dottedtocline{2}{1.5em}{2.3em}}
%\newcommand*\l@subsubsection{\@dottedtocline{3}{3.8em}{3.2em}}
%\newcommand*\l@paragraph{\@dottedtocline{4}{7.0em}{4.1em}}
%\newcommand*\l@subparagraph{\@dottedtocline{5}{10em}{5em}}
%\newcommand\listoffigures{%
% \section*{\listfigurename
% \@mkboth{\MakeUppercase\listfigurename}%
% {\MakeUppercase\listfigurename}}%
% \@starttoc{lof}%
% }
%\newcommand*\l@figure{\@dottedtocline{1}{1.5em}{2.3em}}
%\newcommand\listoftables{%
% \section*{\listtablename
% \@mkboth{%
% \MakeUppercase\listtablename}{\MakeUppercase\listtablename}}%
% \@starttoc{lot}%
% }
%\let\l@table\l@figure
%======================================
%ENVIRONMENTS
%======================================
%ENVIRONMENT: indented
\newenvironment{indented}{\begin{indented}}{\end{indented}}
\newenvironment{varindent}[1]{\begin{varindent}{#1}}{\end{varindent}}
%
\def\indented{\list{}{\itemsep=0\p@\labelsep=0\p@\itemindent=0\p@
\labelwidth=0\p@\leftmargin=\mathindent\topsep=0\p@\partopsep=0\p@
\parsep=0\p@\listparindent=15\p@}\footnotesize\rm}
\let\endindented=\endlist
\def\varindent#1{\setlength{\varind}{#1}%
\list{}{\itemsep=0\p@\labelsep=0\p@\itemindent=0\p@
\labelwidth=0\p@\leftmargin=\varind\topsep=0\p@\partopsep=0\p@
\parsep=0\p@\listparindent=15\p@}\footnotesize\rm}
\let\endvarindent=\endlist
%ENVIRONMENT: abstract
\newenvironment{abstract}{%
\vspace{16pt plus3pt minus3pt}
\begin{indented}
\item[]{\bfseries \abstractname.}\quad\rm\ignorespaces}
{\end{indented}\vspace{10mm}}
%ENVIRONMENT: description
\newenvironment{description}
{\list{}{\labelwidth\z@ \itemindent-\leftmargin
\let\makelabel\descriptionlabel}}
{\endlist}
\newcommand\descriptionlabel[1]{\hspace\labelsep
\normalfont\bfseries #1}
%ENVIRONMENT: quotation
\newenvironment{quotation}
{\list{}{\listparindent 1.5em%
\itemindent \listparindent
\rightmargin \leftmargin
\parsep \z@ \@plus\p@}%
\item[]}
{\endlist}
%ENVIRONMENT: quote
\newenvironment{quote}
{\list{}{\rightmargin\leftmargin}%
\item[]}
{\endlist}
%ENVIRONMENT: verse
\newenvironment{verse}
{\let\\=\@centercr
\list{}{\itemsep \z@
\itemindent -1.5em%
\listparindent\itemindent
\rightmargin \leftmargin
\advance\leftmargin 1.5em}%
\item[]}
{\endlist}
%ENVIRONMENT: bibliography
\newdimen\bibindent
\setlength\bibindent{1.5em}
\def\thebibliography#1{\list
{\hfil[\arabic{enumi}]}{\topsep=0\p@\parsep=0\p@
\partopsep=0\p@\itemsep=0\p@
\labelsep=5\p@\itemindent=-10\p@
\settowidth\labelwidth{\footnotesize[#1]}%
\leftmargin\labelwidth
\advance\leftmargin\labelsep
\advance\leftmargin -\itemindent
\usecounter{enumi}}\footnotesize
\def\newblock{\ }
\sloppy\clubpenalty4000\widowpenalty4000
\sfcode`\.=1000\relax}
\let\endthebibliography=\endlist
\def\numrefs#1{\begin{thebibliography}{#1}}
\def\endnumrefs{\end{thebibliography}}
\let\endbib=\endnumrefs
%%%%%%%%%%%%%%%%%%
%\newenvironment{thebibliography}[1]
% {\section*{References}
% \list{\@biblabel{\@arabic\c@enumiv}}%
% {\settowidth\labelwidth{\@biblabel{#1}}%
% \leftmargin\labelwidth
% \advance\leftmargin\labelsep
% \@openbib@code
% \usecounter{enumiv}%
% \let\p@enumiv\@empty
% \renewcommand\theenumiv{\@arabic\c@enumiv}}%
% \sloppy
% \clubpenalty4000
% \@clubpenalty \clubpenalty
% \widowpenalty4000%
% \sfcode`\.\@m}
% {\def\@noitemerr
% {\@latex@warning{Empty `thebibliography' environment}}%
% \endlist}
%\newcommand\newblock{\hskip .11em\@plus.33em\@minus.07em}
%\let\@openbib@code\@empty
%ENVIRONMENT: theindex
\newenvironment{theindex}
{\if@twocolumn
\@restonecolfalse
\else
\@restonecoltrue
\fi
\columnseprule \z@
\columnsep 35\p@
\twocolumn[\section*{\indexname}]%
\@mkboth{\MakeUppercase\indexname}%
{\MakeUppercase\indexname}%
\thispagestyle{plain}\parindent\z@
\parskip\z@ \@plus .3\p@\relax
\let\item\@idxitem}
{\if@restonecol\onecolumn\else\clearpage\fi}
\newcommand\@idxitem{\par\hangindent 40\p@}
\newcommand\subitem{\@idxitem \hspace*{20\p@}}
\newcommand\subsubitem{\@idxitem \hspace*{30\p@}}
\newcommand\indexspace{\par \vskip 10\p@ \@plus5\p@ \@minus3\p@\relax}
%=====================
\def\appendix{\@ifnextchar*{\@appendixstar}{\@appendix}}
\def\@appendix{\eqnobysec\@appendixstar}
\def\@appendixstar{\@@par
\ifnumbysec % Added 30/4/94 to get Table A1,
\@addtoreset{table}{section} % Table B1 etc if numbering by
\@addtoreset{figure}{section}\fi % section
\setcounter{section}{0}
\setcounter{subsection}{0}
\setcounter{subsubsection}{0}
\setcounter{equation}{0}
\setcounter{figure}{0}
\setcounter{table}{0}
\def\thesection{Appendix \Alph{section}}
\def\theequation{\ifnumbysec
\Alph{section}.\arabic{equation}\else
\Alph{section}\arabic{equation}\fi} % Comment A\arabic{equation} maybe
\def\thetable{\ifnumbysec % better? 15/4/95
\Alph{section}\arabic{table}\else
A\arabic{table}\fi}
\def\thefigure{\ifnumbysec
\Alph{section}\arabic{figure}\else
A\arabic{figure}\fi}}
\def\noappendix{\setcounter{figure}{0}
\setcounter{table}{0}
\def\thetable{\arabic{table}}
\def\thefigure{\arabic{figure}}}
\setlength\arraycolsep{5\p@}
\setlength\tabcolsep{6\p@}
\setlength\arrayrulewidth{.4\p@}
\setlength\doublerulesep{2\p@}
\setlength\tabbingsep{\labelsep}
\skip\@mpfootins = \skip\footins
\setlength\fboxsep{3\p@}
\setlength\fboxrule{.4\p@}
\renewcommand\theequation{\arabic{equation}}
% NAME OF STRUCTURES
\newcommand\contentsname{Contents}
\newcommand\listfigurename{List of Figures}
\newcommand\listtablename{List of Tables}
\newcommand\refname{References}
\newcommand\indexname{Index}
\newcommand\figurename{Figure}
\newcommand\tablename{Table}
\newcommand\partname{Part}
\newcommand\appendixname{Appendix}
\newcommand\abstractname{Abstract}
%Miscellaneous commands
\newcommand{\BibTeX}{{\rm B\kern-.05em{\sc i\kern-.025em b}\kern-.08em
T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}}
\newcommand{\jpcsit}{{\bfseries\itshape\selectfont Journal of Physics: Conference Series}}
\newcommand{\jpcs}{{\itshape\selectfont Journal of Physics: Conference Series}}
\newcommand{\iopp}{IOP Publishing}
\newcommand{\cls}{{\upshape\selectfont\texttt{jpconf.cls}}}
\newcommand{\corg}{conference organizer}
\newcommand\today{\number\day\space\ifcase\month\or
January\or February\or March\or April\or May\or June\or
July\or August\or September\or October\or November\or December\fi
\space\number\year}
\setlength\columnsep{10\p@}
\setlength\columnseprule{0\p@}
\newcommand{\Tables}{\clearpage\section*{Tables and table captions}
\def\fps@table{hp}\noappendix}
\newcommand{\Figures}{\clearpage\section*{Figure captions}
\def\fps@figure{hp}\noappendix}
%
\newcommand{\Figure}[1]{\begin{figure}
\caption{#1}
\end{figure}}
%
\newcommand{\Table}[1]{\begin{table}
\caption{#1}
\begin{indented}
\lineup
\item[]\begin{tabular}{@{}l*{15}{l}}}
\def\endTable{\end{tabular}\end{indented}\end{table}}
\let\endtab=\endTable
%
\newcommand{\fulltable}[1]{\begin{table}
\caption{#1}
\lineup
\begin{tabular*}{\textwidth}{@{}l*{15}{@{\extracolsep{0pt plus 12pt}}l}}}
\def\endfulltable{\end{tabular*}\end{table}}
%BIBLIOGRAPHY and References
%\newcommand{\Bibliography}[1]{\section*{References}\par\numrefs{#1}}
%\newcommand{\References}{\section*{References}\par\refs}
%\def\thebibliography#1{\list
% {\hfil[\arabic{enumi}]}{\topsep=0\p@\parsep=0\p@
% \partopsep=0\p@\itemsep=0\p@
% \labelsep=5\p@\itemindent=-10\p@
% \settowidth\labelwidth{\footnotesize[#1]}%
% \leftmargin\labelwidth
% \advance\leftmargin\labelsep
% \advance\leftmargin -\itemindent
% \usecounter{enumi}}\footnotesize
% \def\newblock{\ }
% \sloppy\clubpenalty4000\widowpenalty4000
% \sfcode`\.=1000\relax}
%\let\endthebibliography=\endlist
%\def\numrefs#1{\begin{thebibliography}{#1}}
%\def\endnumrefs{\end{thebibliography}}
%\let\endbib=\endnumrefs
\def\thereferences{\list{}{\topsep=0\p@\parsep=0\p@
\partopsep=0\p@\itemsep=0\p@\labelsep=0\p@\itemindent=-18\p@
\labelwidth=0\p@\leftmargin=18\p@
}\footnotesize\rm
\def\newblock{\ }
\sloppy\clubpenalty4000\widowpenalty4000
\sfcode`\.=1000\relax}%
\let\endthereferences=\endlist
% MISC EQUATRION STUFF
%\def\[{\relax\ifmmode\@badmath\else
% \begin{trivlist}
% \@beginparpenalty\predisplaypenalty
% \@endparpenalty\postdisplaypenalty
% \item[]\leavevmode
% \hbox to\linewidth\bgroup$ \displaystyle
% \hskip\mathindent\bgroup\fi}
%\def\]{\relax\ifmmode \egroup $\hfil \egroup \end{trivlist}\else \@badmath \fi}
%\def\equation{\@beginparpenalty\predisplaypenalty
% \@endparpenalty\postdisplaypenalty
%\refstepcounter{equation}\trivlist \item[]\leavevmode
% \hbox to\linewidth\bgroup $ \displaystyle
%\hskip\mathindent}
%\def\endequation{$\hfil \displaywidth\linewidth\@eqnnum\egroup \endtrivlist}
%\@namedef{equation*}{\[}
%\@namedef{endequation*}{\]}
%\def\eqnarray{\stepcounter{equation}\let\@currentlabel=\theequation
%\global\@eqnswtrue
%\global\@eqcnt\z@\tabskip\mathindent\let\\=\@eqncr
%\abovedisplayskip\topsep\ifvmode\advance\abovedisplayskip\partopsep\fi
%\belowdisplayskip\abovedisplayskip
%\belowdisplayshortskip\abovedisplayskip
%\abovedisplayshortskip\abovedisplayskip
%$$\halign to
%\linewidth\bgroup\@eqnsel$\displaystyle\tabskip\z@
% {##{}}$&\global\@eqcnt\@ne $\displaystyle{{}##{}}$\hfil
% &\global\@eqcnt\tw@ $\displaystyle{{}##}$\hfil
% \tabskip\@centering&\llap{##}\tabskip\z@\cr}
%\def\endeqnarray{\@@eqncr\egroup
% \global\advance\c@equation\m@ne$$\global\@ignoretrue }
%\mathindent = 6pc
%%
%\def\eqalign#1{\null\vcenter{\def\\{\cr}\openup\jot\m@th
% \ialign{\strut$\displaystyle{##}$\hfil&$\displaystyle{{}##}$\hfil
% \crcr#1\crcr}}\,}
%%
%\def\eqalignno#1{\displ@y \tabskip\z@skip
% \halign to\displaywidth{\hspace{5pc}$\@lign\displaystyle{##}$%
% \tabskip\z@skip
% &$\@lign\displaystyle{{}##}$\hfill\tabskip\@centering
% &\llap{$\@lign\hbox{\rm##}$}\tabskip\z@skip\crcr
% #1\crcr}}
%%
\newif\ifnumbysec
\def\theequation{\ifnumbysec
\arabic{section}.\arabic{equation}\else
\arabic{equation}\fi}
\def\eqnobysec{\numbysectrue\@addtoreset{equation}{section}}
\newcounter{eqnval}
\def\numparts{\addtocounter{equation}{1}%
\setcounter{eqnval}{\value{equation}}%
\setcounter{equation}{0}%
\def\theequation{\ifnumbysec
\arabic{section}.\arabic{eqnval}{\it\alph{equation}}%
\else\arabic{eqnval}{\it\alph{equation}}\fi}}
\def\endnumparts{\def\theequation{\ifnumbysec
\arabic{section}.\arabic{equation}\else
\arabic{equation}\fi}%
\setcounter{equation}{\value{eqnval}}}
%
\def\cases#1{%
\left\{\,\vcenter{\def\\{\cr}\normalbaselines\openup1\jot\m@th%
\ialign{\strut$\displaystyle{##}\hfil$&\tqs
\rm##\hfil\crcr#1\crcr}}\right.}%
\def\eqalign#1{\null\vcenter{\def\\{\cr}\openup\jot\m@th
\ialign{\strut$\displaystyle{##}$\hfil&$\displaystyle{{}##}$\hfil
\crcr#1\crcr}}\,}
% OTHER USEFUL BITS
\newcommand{\e}{\mathrm{e}}
\newcommand{\rme}{\mathrm{e}}
\newcommand{\rmi}{\mathrm{i}}
\newcommand{\rmd}{\mathrm{d}}
\renewcommand{\qquad}{\hspace*{25pt}}
\newcommand{\tdot}[1]{\stackrel{\dots}{#1}} % Added 1/9/94
\newcommand{\tqs}{\hspace*{25pt}}
\newcommand{\fl}{\hspace*{-\mathindent}}
\newcommand{\Tr}{\mathop{\mathrm{Tr}}\nolimits}
\newcommand{\tr}{\mathop{\mathrm{tr}}\nolimits}
\newcommand{\Or}{\mathord{\mathrm{O}}} %changed from \mathop 20/1/95
\newcommand{\lshad}{[\![}
\newcommand{\rshad}{]\!]}
\newcommand{\case}[2]{{\textstyle\frac{#1}{#2}}}
\def\pt(#1){({\it #1\/})}
\newcommand{\dsty}{\displaystyle}
\newcommand{\tsty}{\textstyle}
\newcommand{\ssty}{\scriptstyle}
\newcommand{\sssty}{\scriptscriptstyle}
\def\lo#1{\llap{${}#1{}$}}
\def\eql{\llap{${}={}$}}
\def\lsim{\llap{${}\sim{}$}}
\def\lsimeq{\llap{${}\simeq{}$}}
\def\lequiv{\llap{${}\equiv{}$}}
%
\newcommand{\eref}[1]{(\ref{#1})}
%\newcommand{\eqref}[1]{Equation (\ref{#1})}
%\newcommand{\Eqref}[1]{Equation (\ref{#1})}
\newcommand{\sref}[1]{section~\ref{#1}}
\newcommand{\fref}[1]{figure~\ref{#1}}
\newcommand{\tref}[1]{table~\ref{#1}}
\newcommand{\Sref}[1]{Section~\ref{#1}}
\newcommand{\Fref}[1]{Figure~\ref{#1}}
\newcommand{\Tref}[1]{Table~\ref{#1}}
\newcommand{\opencircle}{\mbox{\Large$\circ\,$}} % moved Large outside maths
\newcommand{\opensquare}{\mbox{$\rlap{$\sqcap$}\sqcup$}}
\newcommand{\opentriangle}{\mbox{$\triangle$}}
\newcommand{\opentriangledown}{\mbox{$\bigtriangledown$}}
\newcommand{\opendiamond}{\mbox{$\diamondsuit$}}
\newcommand{\fullcircle}{\mbox{{\Large$\bullet\,$}}} % moved Large outside maths
\newcommand{\fullsquare}{\,\vrule height5pt depth0pt width5pt}
\newcommand{\dotted}{\protect\mbox{${\mathinner{\cdotp\cdotp\cdotp\cdotp\cdotp\cdotp}}$}}
\newcommand{\dashed}{\protect\mbox{-\; -\; -\; -}}
\newcommand{\broken}{\protect\mbox{-- -- --}}
\newcommand{\longbroken}{\protect\mbox{--- --- ---}}
\newcommand{\chain}{\protect\mbox{--- $\cdot$ ---}}
\newcommand{\dashddot}{\protect\mbox{--- $\cdot$ $\cdot$ ---}}
\newcommand{\full}{\protect\mbox{------}}
\def\;{\protect\psemicolon}
\def\psemicolon{\relax\ifmmode\mskip\thickmuskip\else\kern .3333em\fi}
\def\lineup{\def\0{\hbox{\phantom{0}}}%
\def\m{\hbox{$\phantom{-}$}}%
\def\-{\llap{$-$}}}
%
%%%%%%%%%%%%%%%%%%%%%
% Tables rules %
%%%%%%%%%%%%%%%%%%%%%
\newcommand{\boldarrayrulewidth}{1\p@}
% Width of bold rule in tabular environment.
\def\bhline{\noalign{\ifnum0=`}\fi\hrule \@height
\boldarrayrulewidth \futurelet \@tempa\@xhline}
\def\@xhline{\ifx\@tempa\hline\vskip \doublerulesep\fi
\ifnum0=`{\fi}}
%
% Rules for tables with extra space around
%
\newcommand{\br}{\ms\bhline\ms}
\newcommand{\mr}{\ms\hline\ms}
%
\newcommand{\centre}[2]{\multispan{#1}{\hfill #2\hfill}}
\newcommand{\crule}[1]{\multispan{#1}{\hspace*{\tabcolsep}\hrulefill
\hspace*{\tabcolsep}}}
\newcommand{\fcrule}[1]{\ifnum\thetabtype=1\multispan{#1}{\hrulefill
\hspace*{\tabcolsep}}\else\multispan{#1}{\hrulefill}\fi}
%
% Extra spaces for tables and displayed equations
%
\newcommand{\ms}{\noalign{\vspace{3\p@ plus2\p@ minus1\p@}}}
\newcommand{\bs}{\noalign{\vspace{6\p@ plus2\p@ minus2\p@}}}
\newcommand{\ns}{\noalign{\vspace{-3\p@ plus-1\p@ minus-1\p@}}}
\newcommand{\es}{\noalign{\vspace{6\p@ plus2\p@ minus2\p@}}\displaystyle}%
%
\newcommand{\etal}{{\it et al\/}\ }
\newcommand{\dash}{------}
\newcommand{\nonum}{\par\item[]} %\par added 1/9/93
\newcommand{\mat}[1]{\underline{\underline{#1}}}
%
% abbreviations for IOPP journals
%
\newcommand{\CQG}{{\it Class. Quantum Grav.} }
\newcommand{\CTM}{{\it Combust. Theory Modelling\/} }
\newcommand{\DSE}{{\it Distrib. Syst. Engng\/} }
\newcommand{\EJP}{{\it Eur. J. Phys.} }
\newcommand{\HPP}{{\it High Perform. Polym.} } % added 4/5/93
\newcommand{\IP}{{\it Inverse Problems\/} }
\newcommand{\JHM}{{\it J. Hard Mater.} } % added 4/5/93
\newcommand{\JO}{{\it J. Opt.} }
\newcommand{\JOA}{{\it J. Opt. A: Pure Appl. Opt.} }
\newcommand{\JOB}{{\it J. Opt. B: Quantum Semiclass. Opt.} }
\newcommand{\JPA}{{\it J. Phys. A: Math. Gen.} }
\newcommand{\JPB}{{\it J. Phys. B: At. Mol. Phys.} } %1968-87
\newcommand{\jpb}{{\it J. Phys. B: At. Mol. Opt. Phys.} } %1988 and onwards
\newcommand{\JPC}{{\it J. Phys. C: Solid State Phys.} } %1968--1988
\newcommand{\JPCM}{{\it J. Phys.: Condens. Matter\/} } %1989 and onwards
\newcommand{\JPD}{{\it J. Phys. D: Appl. Phys.} }
\newcommand{\JPE}{{\it J. Phys. E: Sci. Instrum.} }
\newcommand{\JPF}{{\it J. Phys. F: Met. Phys.} }
\newcommand{\JPG}{{\it J. Phys. G: Nucl. Phys.} } %1975--1988
\newcommand{\jpg}{{\it J. Phys. G: Nucl. Part. Phys.} } %1989 and onwards
\newcommand{\MSMSE}{{\it Modelling Simulation Mater. Sci. Eng.} }
\newcommand{\MST}{{\it Meas. Sci. Technol.} } %1990 and onwards
\newcommand{\NET}{{\it Network: Comput. Neural Syst.} }
\newcommand{\NJP}{{\it New J. Phys.} }
\newcommand{\NL}{{\it Nonlinearity\/} }
\newcommand{\NT}{{\it Nanotechnology} }
\newcommand{\PAO}{{\it Pure Appl. Optics\/} }
\newcommand{\PM}{{\it Physiol. Meas.} } % added 4/5/93
\newcommand{\PMB}{{\it Phys. Med. Biol.} }
\newcommand{\PPCF}{{\it Plasma Phys. Control. Fusion\/} } % added 4/5/93
\newcommand{\PSST}{{\it Plasma Sources Sci. Technol.} }
\newcommand{\PUS}{{\it Public Understand. Sci.} }
\newcommand{\QO}{{\it Quantum Opt.} }
\newcommand{\QSO}{{\em Quantum Semiclass. Opt.} }
\newcommand{\RPP}{{\it Rep. Prog. Phys.} }
\newcommand{\SLC}{{\it Sov. Lightwave Commun.} } % added 4/5/93
\newcommand{\SST}{{\it Semicond. Sci. Technol.} }
\newcommand{\SUST}{{\it Supercond. Sci. Technol.} }
\newcommand{\WRM}{{\it Waves Random Media\/} }
\newcommand{\JMM}{{\it J. Micromech. Microeng.\/} }
%
% Other commonly quoted journals
%
\newcommand{\AC}{{\it Acta Crystallogr.} }
\newcommand{\AM}{{\it Acta Metall.} }
\newcommand{\AP}{{\it Ann. Phys., Lpz.} }
\newcommand{\APNY}{{\it Ann. Phys., NY\/} }
\newcommand{\APP}{{\it Ann. Phys., Paris\/} }
\newcommand{\CJP}{{\it Can. J. Phys.} }
\newcommand{\JAP}{{\it J. Appl. Phys.} }
\newcommand{\JCP}{{\it J. Chem. Phys.} }
\newcommand{\JJAP}{{\it Japan. J. Appl. Phys.} }
\newcommand{\JP}{{\it J. Physique\/} }
\newcommand{\JPhCh}{{\it J. Phys. Chem.} }
\newcommand{\JMMM}{{\it J. Magn. Magn. Mater.} }
\newcommand{\JMP}{{\it J. Math. Phys.} }
\newcommand{\JOSA}{{\it J. Opt. Soc. Am.} }
\newcommand{\JPSJ}{{\it J. Phys. Soc. Japan\/} }
\newcommand{\JQSRT}{{\it J. Quant. Spectrosc. Radiat. Transfer\/} }
\newcommand{\NC}{{\it Nuovo Cimento\/} }
\newcommand{\NIM}{{\it Nucl. Instrum. Methods\/} }
\newcommand{\NP}{{\it Nucl. Phys.} }
\newcommand{\PL}{{\it Phys. Lett.} }
\newcommand{\PR}{{\it Phys. Rev.} }
\newcommand{\PRL}{{\it Phys. Rev. Lett.} }
\newcommand{\PRS}{{\it Proc. R. Soc.} }
\newcommand{\PS}{{\it Phys. Scr.} }
\newcommand{\PSS}{{\it Phys. Status Solidi\/} }
\newcommand{\PTRS}{{\it Phil. Trans. R. Soc.} }
\newcommand{\RMP}{{\it Rev. Mod. Phys.} }
\newcommand{\RSI}{{\it Rev. Sci. Instrum.} }
\newcommand{\SSC}{{\it Solid State Commun.} }
\newcommand{\ZP}{{\it Z. Phys.} }
%===================
\pagestyle{headings}
\pagenumbering{arabic}
\raggedbottom
\onecolumn
\endinput
%%
%% End of file `jconf.cls'.
%%
%% This is file `jpconf11.clo'
%%
%% This file is distributed in the hope that it will be useful,
%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
%%
%% \CharacterTable
%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%% Digits \0\1\2\3\4\5\6\7\8\9
%% Exclamation \! Double quote \" Hash (number) \#
%% Dollar \$ Percent \% Ampersand \&
%% Acute accent \' Left paren \( Right paren \)
%% Asterisk \* Plus \+ Comma \,
%% Minus \- Point \. Solidus \/
%% Colon \: Semicolon \; Less than \<
%% Equals \= Greater than \> Question mark \?
%% Commercial at \@ Left bracket \[ Backslash \\
%% Right bracket \] Circumflex \^ Underscore \_
%% Grave accent \` Left brace \{ Vertical bar \|
%% Right brace \} Tilde \~}
\ProvidesFile{jpconf11.clo}[2005/05/04 v1.0 LaTeX2e file (size option)]
\renewcommand\normalsize{%
\@setfontsize\normalsize\@xipt{13}%
\abovedisplayskip 12\p@ \@plus3\p@ \@minus7\p@
\abovedisplayshortskip \z@ \@plus3\p@
\belowdisplayshortskip 6.5\p@ \@plus3.5\p@ \@minus3\p@
\belowdisplayskip \abovedisplayskip
\let\@listi\@listI}
\normalsize
\newcommand\small{%
\@setfontsize\small\@xpt{12}%
\abovedisplayskip 11\p@ \@plus3\p@ \@minus6\p@
\abovedisplayshortskip \z@ \@plus3\p@
\belowdisplayshortskip 6.5\p@ \@plus3.5\p@ \@minus3\p@
\def\@listi{\leftmargin\leftmargini
\topsep 9\p@ \@plus3\p@ \@minus5\p@
\parsep 4.5\p@ \@plus2\p@ \@minus\p@
\itemsep \parsep}%
\belowdisplayskip \abovedisplayskip}
\newcommand\footnotesize{%
% \@setfontsize\footnotesize\@xpt\@xiipt
\@setfontsize\footnotesize\@ixpt{11}%
\abovedisplayskip 10\p@ \@plus2\p@ \@minus5\p@
\abovedisplayshortskip \z@ \@plus3\p@
\belowdisplayshortskip 6\p@ \@plus3\p@ \@minus3\p@
\def\@listi{\leftmargin\leftmargini
\topsep 6\p@ \@plus2\p@ \@minus2\p@
\parsep 3\p@ \@plus2\p@ \@minus\p@
\itemsep \parsep}%
\belowdisplayskip \abovedisplayskip
}
\newcommand\scriptsize{\@setfontsize\scriptsize\@viiipt{9.5}}
\newcommand\tiny{\@setfontsize\tiny\@vipt\@viipt}
\newcommand\large{\@setfontsize\large\@xivpt{18}}
\newcommand\Large{\@setfontsize\Large\@xviipt{22}}
\newcommand\LARGE{\@setfontsize\LARGE\@xxpt{25}}
\newcommand\huge{\@setfontsize\huge\@xxvpt{30}}
\let\Huge=\huge
\if@twocolumn
\setlength\parindent{14\p@}
\else
\setlength\parindent{18\p@}
\fi
\if@letterpaper%
%\input{letmarg.tex}%
\setlength{\hoffset}{0mm}
\setlength{\marginparsep}{0mm}
\setlength{\marginparwidth}{0mm}
\setlength{\textwidth}{160mm}
\setlength{\oddsidemargin}{-0.4mm}
\setlength{\evensidemargin}{-0.4mm}
\setlength{\voffset}{0mm}
\setlength{\headheight}{8mm}
\setlength{\headsep}{5mm}
\setlength{\footskip}{0mm}
\setlength{\textheight}{230mm}
\setlength{\topmargin}{1.6mm}
\else
%\input{a4marg.tex}%
\setlength{\hoffset}{0mm}
\setlength{\marginparsep}{0mm}
\setlength{\marginparwidth}{0mm}
\setlength{\textwidth}{160mm}
\setlength{\oddsidemargin}{-0.4mm}
\setlength{\evensidemargin}{-0.4mm}
\setlength{\voffset}{0mm}
\setlength{\headheight}{8mm}
\setlength{\headsep}{5mm}
\setlength{\footskip}{0mm}
\setlength{\textheight}{230mm}
\setlength{\topmargin}{1.6mm}
\fi
\setlength\maxdepth{.5\topskip}
\setlength\@maxdepth\maxdepth
\setlength\footnotesep{8.4\p@}
\setlength{\skip\footins} {10.8\p@ \@plus 4\p@ \@minus 2\p@}
\setlength\floatsep {14\p@ \@plus 2\p@ \@minus 4\p@}
\setlength\textfloatsep {24\p@ \@plus 2\p@ \@minus 4\p@}
\setlength\intextsep {16\p@ \@plus 4\p@ \@minus 4\p@}
\setlength\dblfloatsep {16\p@ \@plus 2\p@ \@minus 4\p@}
\setlength\dbltextfloatsep{24\p@ \@plus 2\p@ \@minus 4\p@}
\setlength\@fptop{0\p@}
\setlength\@fpsep{10\p@ \@plus 1fil}
\setlength\@fpbot{0\p@}
\setlength\@dblfptop{0\p@}
\setlength\@dblfpsep{10\p@ \@plus 1fil}
\setlength\@dblfpbot{0\p@}
\setlength\partopsep{3\p@ \@plus 2\p@ \@minus 2\p@}
\def\@listI{\leftmargin\leftmargini
\parsep=\z@
\topsep=6\p@ \@plus3\p@ \@minus3\p@
\itemsep=3\p@ \@plus2\p@ \@minus1\p@}
\let\@listi\@listI
\@listi
\def\@listii {\leftmargin\leftmarginii
\labelwidth\leftmarginii
\advance\labelwidth-\labelsep
\topsep=3\p@ \@plus2\p@ \@minus\p@
\parsep=\z@
\itemsep=\parsep}
\def\@listiii{\leftmargin\leftmarginiii
\labelwidth\leftmarginiii
\advance\labelwidth-\labelsep
\topsep=\z@
\parsep=\z@
\partopsep=\z@
\itemsep=\z@}
\def\@listiv {\leftmargin\leftmarginiv
\labelwidth\leftmarginiv
\advance\labelwidth-\labelsep}
\def\@listv{\leftmargin\leftmarginv
\labelwidth\leftmarginv
\advance\labelwidth-\labelsep}
\def\@listvi {\leftmargin\leftmarginvi
\labelwidth\leftmarginvi
\advance\labelwidth-\labelsep}
\endinput
%%
%% End of file `iopart12.clo'.
\documentclass[a4paper]{jpconf}
\usepackage{url}
\usepackage{graphicx}
\usepackage{float}
\newcommand{\quotes}[1]{``#1''}
\begin{document}
\title{StoRM 2: initial design and development activities}
\author{
A.~Ceccanti$^1$,
F.~Giacomini$^1$,
E.~Vianello$^1$,
E.~Ronchieri$^1$
}
\address{$^1$ INFN-CNAF, Bologna, IT}
\ead{
andrea.ceccanti@cnaf.infn.it
}
\begin{abstract}
StoRM is the storage element solution that powers the CNAF Tier 1
data center as well as more than 30 other sites. Experience in
developing, maintaining and operating it at scale suggests that a
significant refactoring of the codebase is necessary to improve
StoRM maintainability, reliability, scalability and ease of
operation in order to meet the data management requirements coming
from HL-LHC and other communities served by the CNAF Tier 1 data
center. In this contribution we highlight the initial StoRM 2
design and development activities.
\end{abstract}
\section{Introduction}
\label{sec:introduction}
StoRM was first developed by a joint collaboration between INFN-CNAF, CERN and
ICTP to provide a lightweight storage element solution implementing the
SRM~\cite{ref:srm} interface on top of a POSIX filesystem. StoRM has a layered
architecture (Figure~\ref{fig:storm-arch}), split between two main components:
the StoRM frontend and backend services. The StoRM frontend service implements
the SRM interface exposed to client applications and frameworks. The StoRM
backend service implements the actual storage management logic by interacting
directly with the underlying file system.
Communication between the frontend and the backend services happens in two ways:
\begin{itemize}
\item via an XML-RPC API, for synchronous requests;
\item via a database, for asynchronous requests.
\end{itemize}
Data transfers are provided by GridFTP, HTTP and XRootD services accessing
directly the file system underlying the StoRM deployment.
StoRM is interfaced with the IBM Tivoli Storage Manager (TSM) via
GEMSS~\cite{ref:gemss}, a component also developed at INFN, to provide optimized
data archiving and tape recall functionality.
The StoRM WebDAV service provides an alternative data management interface
complementary to the SRM functionality, albeit without supporting tape
operations yet.
In the past years StoRM has powered the CNAF Tier 1 data center as well as
dozens of other sites and proved to be a reliable SRM implementation. However,
ten years of experience in developing and operating the service at scale has
also shown limitations:
\begin{itemize}
\item The StoRM code base is not unit-tested; this means that there is no
quick feedback loop that functionality is not broken when a change is
introduced or a refactoring is implemented; there are integration and load
test suites that can be used to assess that functionality is not broken,
but these test suites are more complex to instantiate, require a full
service deployment and do no provide coverage information.
\item Data management responsibilities are scattered among several
components without clear reasons, increasing maintenance and developments
costs.
\item The StoRM backend cannot be horizontally replicated; this causes
operational problems in production and limits scalability and the ability
to adapt dynamically to load changes.
\item Logging is not harmonized among the StoRM services and limited
tracing is provided, so that it is not trivial to trace the history of an
incoming request across the services.
\item Core StoRM communication and authentication functionality relies on
dated technologies and libraries (e.g., XML-RPC, CGSI-gSOAP);
\item The codebase is significantly more complex than needed due to the
inorganic growth and lack of periodic quality assessment performed on the
code base.
\end{itemize}
To address these shortcomings, a redesign of the StoRM service has been planned
and started this year, in parallel with the main StoRM maintenance and
development activities.
\begin{figure}
\centering
\includegraphics[width=.6\textwidth]{storm-arch.png}
\caption{\label{fig:storm-arch}The StoRM 1 architecture.}
\end{figure}
\section{StoRM 2 high-level architecture}
The StoRM 2 architecture is depicted in Figure~\ref{fig:storm2-arch}.
\begin{figure}
\centering
\includegraphics[width=.6\textwidth]{high-level-arch.png}
\caption{\label{fig:storm2-arch}The StoRM 2 high-level architecture.}
\end{figure}
The layered architecture approach is maintained, so that service logic is again
split between frontend and backend service components.
The frontend responsibility is to implement the interfaces towards the outside
world. In practice, the frontend is implemented by multiple microservices,
each responsible of a specific interface (SRM, WebDAV, etc.).
TLS termination and client authentication is implemented at the edge of the
service perimeter by one (or more) Nginx reverse proxy instances. There are
several advantages in this approach:
\begin{itemize}
\item The TLS handling load is decoupled from request management load.
\item VOMS-related configuration and handling is centralized to a single
component, leading to simplified service operation and troubleshooting.
\item The TLS terminator becomes a natural place to implement load balancing
for the frontend services.
\end{itemize}
VOMS authorization support is provided by an Nginx VOMS module
~\cite{ref:nginx-voms} developed for this purpose and described in more detail
in another contribution in this report.
Besides implementing the management protocol endpoints, the frontends expose other
management and monitoring interfaces that can be consumed by internal services and
may use a relational or in-memory database to persist state information in support
of request management and accounting.
Frontends do not directly interact with the storage, but delegate the
interaction to a backend service.
The backend is a stateless service that implements basic management operations on the
storage. The storage management operations implemented are the minimum set of
operations needed to support the data management interfaces exposed by the
frontends. These operations are typically either data object lifecycle
operations (e.g., create or remove a file or a directory, list directory contents) or
metadata operations (e.g., get the size of a file, manage ACLs).
The communication between the frontend and the backend services is implemented
on top of gRPC~\cite{ref:grpc}, a remote procedure call system initially
developed at Google. The actual messages exchanged between them are
synthesized from a description expressed in an interface description language
called \textit{Protocol Buffers}~\cite{ref:protocol-buffers}; from the same
message description, language-specific client and server stubs are generated. As
an example, the following listing shows the description of the messages and of
the service involved in the simple case of the \textit{version} command.
{\small
\begin{verbatim}
message VersionRequest {
// The version of the client calling the service.
string version = 1;
}
message VersionResponse {
// The version of the service answering the call
string version = 1;
}
service VersionService {
rpc getVersion(VersionRequest) returns (VersionResponse);
}
\end{verbatim}
}
\section{Principles guiding the development work}
The following principles have driven the StoRM 2 development work.
\begin{itemize}
\item The source code will be kept in a Git repository hosted on the INFN
Gitlab service; the development will follow a branching model inspired
at Git-workflow~\cite{ref:gitflow} and already successfully used for other
components developed by the team (e.g., VOMS, INDIGO IAM, StoRM).
\item Rhe code for all main components (frontend and backend services,
CLIs, etc.) will be hosted on a single repository and a single version number
will be shared for all the components.
\item A test-driven development approach will be followed, using tools that
allow to measure the test coverage of the codebase. The objective is to
ensure high coverage ($>90\%$) on all code.
\item Whenever possible, the code should be self-documenting; the source code folder
structure will be documented with README.md files providing a
description of each folder contents; a CHANGELOG file will provide
information of new features and bug fixes following established
industry best practices~\cite{ref:keep-a-changelog}.
\item The development and testing environment will be containerized, in
order to ensure a consistent environment definition and avoid "works on my
machine" issues.
\item Services should provide monitoring and metrics endpoints to enable the
collection of status information and performance metrics.
\item Service should support graceful shutdown and draining.
\item A CI pipeline will be in place, to build and test continuously the code.
\item A consistent configuration and logging format will be adopted across
all the components, to make service operations easier and simplify log
files interpretation, aggregation and management.
\item Support for request traceability will be part of the system since its
inception.
\end{itemize}
The development of StoRM 2 will be organized in SCRUM-like sprints, where each
sprint will be roughly 4-5 weeks long.
The output of each sprint should be a deployable instance of the services
implementing a subset of the whole foreseen StoRM 2 functionality.
\section{The build and test environment}
The build environment heavily relies on container technology~\cite{ref:docker},
both to guarantee full build and test reproducibility and to offer a common
reference platform for development.
Since the code for all components is kept in a single git repository, we have
also opted for a single Docker image to build everything, containing all the
needed build tools (compilers, unit testing frameworks, static and dynamic
analyzers, external dependencies, etc.). The resulting image is large but still
manageable and having one image simplifies the operations.
There are also a couple of other Docker images: one is a specialization of the
build image mentioned above and is dedicated to the build of the Nginx VOMS
module; the other is an image with client tools used during integration testing.
All the image Dockerfiles are kept in a single repository, under continuous
integration, so that every time there is a change the images are rebuilt.
\section{The StoRM 2 frontend component}
The StoRM 2 frontend is composed of a set of stateless Spring Boot 2
applications written in Java that implement the management protocol endpoints,
such as SRM~\cite{ref:srm} and WebDAV~\cite{ref:webdav}. The frontend services
maintain state in an external database.
The main frontend responsibilities are to:
\begin{itemize}
\item implement consistent authorization, taking as input the
authentication information exposed by the Nginx TLS terminator and
matching this information with a common authorization policy;
\item implement request validation and management, i.e.,
protocol-specific management of request queuing as well as conflict
handling;
\item translate protocol-specific requests to a set of basic storage
management operations executed by the backend and exposed via a set of
gRPC services;
\item provide service management and observability endpoints, to allow
administrators to get information about the requests currently being
serviced by the system, drain the service or manually force request status
transitions.
\end{itemize}
The first frontend service developed in StoRM 2 focuses on the SRM interface,
and at the time of this writing implements support for the SRM \textit{ping} and
\textit{ls} methods.
In the initial development sprints, significant work has been devoted to ensure
the testability of the frontend component in isolation, by leveraging the
powerful testing support provided by Spring~\cite{ref:spring} and the gRPC
frameworks.
\section{The StoRM 2 backend component}
The StoRM 2 backend is a gRPC server that provides multiple
services. One service responds to \textit{version} requests. Another
service responds to storage-related requests, which represent the main
scope of StoRM. In general there is no direct, one-to-one mapping
between SRM requests arriving at the frontend and requests addressed
to the backend; rather, these represent building blocks that the
frontend can compose in order to prepare the responses to SRM clients.
Among the storage requests addressed to the backend, at the moment
only a couple are implemented: \textit{ls}, in its multiple variations
(for a file or a directory, recursive, up to a given depth, etc.),
returns information about files and directories; \textit{pin},
\textit{unpin} and \textit{pin status} manage the
\verb|user.storm.pinned| attribute of filesystem entities, which is
essential for the implementation of the more complex
\textit{srmPrepareToGet} SRM request.
All the backend requests are currently blocking: a response is sent
back to the frontend only when the request has been fully processed.
The backend also incorporates sub-components of more general utility
to operate on Filesystem Extended Attributes and POSIX Access Control
Lists~\cite{p1003.1e}, adding a layer of safety and expressivity on
top of the native C APIs. They allow to define attributes and ACLs
respectively and to apply them to or read them from filesystem
entities.
For example the following sets the attribute \verb|user.storm.pinned|
of file \verb|myFile.txt| to the pin duration:
{\small
\begin{verbatim}
set_xattr(
storage_dir / "myFile.txt",
StormXAttrName{"pinned"},
XAttrValue{duration}
);
\end{verbatim}
}
The following instead extends the ACL currently assigned to
\verb|myFile.txt| with some additional entries:
{\small
\begin{verbatim}
add_to_access_acl(
storage_dir / "myFile.txt",
{
{User{"storm"}, Perms::Read | Perms::Write},
{Group{"storm"}, Perms::Read},
{other, Perms::None}
}
);
\end{verbatim}
}
The backend is implemented in C++, in the latest standard version
supported by the toolset installed in the reference platform
(currently C++17). The build system is based on CMake.
The backend relies on some other third-party dependencies, the most
important being for interaction with the filesystem (Boost
Filesystem~\cite{ref:boost.fs}), for logging (Boost
Log~\cite{ref:boost.log}) and for handling configuration
(yaml-cpp~\cite{ref:yaml-cpp}).
\section{Test suite and continuous integration}
The test suite is based on the Robot Framework~\cite{ref:rf} and is typically
run in a Docker container. A deployment test pipeline~\cite{ref:glcip} runs on
our Gitlab-based continuous integration (CI) system every night (and after any
commit on the master branch) to instantiate the main StoRM 2 services and
execute the SRM testsuite. The reports of the test suite execution are archived
and published on the Gitlab CI dashboard. Services and the test suite are
orchestrated using Docker Compose~\cite{ref:dc}. This approach provides an
intuitive, self-contained testing environment deployable on the CI system and on
the developers workstations.
The test deployment mirrors the architecture shown in
Figure~\ref{fig:storm-arch}, with clients and services placed in different
docker networks to mimic a real-life deployment scenario.
\section{Conclusions and future work}
In this contribution we have described the initial design and development
activities performed during 2018 on StoRM 2, the next incarnation of the StoRM
storage management system.
The main objectives of the StoRM refactoring is to improve the service
scalability and manageability in order to meet the data management requirements
of HL-LHC. The initial work of this year focused on choosing tools,
methodologies and approach with a strong emphasis on software quality.
In the future we will build on this groundwork to provide a full replacement
for the existing StoRM implementation. The lack of dedicated manpower for this
activity makes it hard to estimate when StoRM 2 will be ready to be deployed in
production.
\section*{References}
\bibliographystyle{iopart-num}
\bibliography{biblio}
\end{document}
contributions/sd_storm2/storm-arch.png

87.3 KiB