<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Documentation – OpenStack</title><link>/providers/cloud-compute/openstack/</link><description>Recent content in OpenStack on Documentation</description><generator>Hugo -- gohugo.io</generator><atom:link href="/providers/cloud-compute/openstack/index.xml" rel="self" type="application/rss+xml"/><item><title>Providers: Check-in</title><link>/providers/cloud-compute/openstack/aai/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/providers/cloud-compute/openstack/aai/</guid><description>
&lt;p>The integration of OpenStack service providers into the EGI Check-in is a
two-step process:&lt;/p>
&lt;ol>
&lt;li>Test integration with the demo instance of EGI Check-in. This will allow you
to check the complete functionality of the system without affecting the
production Check-in service.&lt;/li>
&lt;li>Once the integration is working correctly, register your provider with the
production instance of EGI Check-in to allow members of the EGI User
Community to access your service.&lt;/li>
&lt;/ol>
&lt;h2 id="registration-into-check-in-demo-instance">Registration into Check-in demo instance&lt;/h2>
&lt;p>Before your service can use the EGI Check-in OIDC Provider for user login, you
need to register a client through the
&lt;a href="https://aai.egi.eu/federation">EGI Federation Registry&lt;/a> in order to obtain
OAuth2.0 credentials and register one or more redirect URIs.&lt;/p>
&lt;p>Make sure that you fill in the following options:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;em>General&lt;/em> tab:&lt;/p>
&lt;blockquote>
&lt;ul>
&lt;li>Set &lt;em>Integration Environment&lt;/em> to &lt;em>Demo&lt;/em> and fill the form with the
information about your Service.&lt;/li>
&lt;/ul>
&lt;/blockquote>
&lt;/li>
&lt;li>
&lt;p>&lt;em>Protocol Specific&lt;/em> tab:&lt;/p>
&lt;blockquote>
&lt;ul>
&lt;li>Set &lt;em>Select Protocol&lt;/em> to &lt;em>OIDC Service&lt;/em>&lt;/li>
&lt;li>Set redirect URL to
&lt;code>https://&amp;lt;your keystone endpoint&amp;gt;/v3/auth/OS-FEDERATION/websso/openid/redirect&lt;/code>.
Recent versions of OpenStack may deploy Keystone at &lt;code>/identity/&lt;/code>, be sure
to include that in the &lt;code>&amp;lt;your keystone endpoint&amp;gt;&lt;/code> part of the URL if
needed.&lt;/li>
&lt;li>Enable &lt;em>openid&lt;/em>, &lt;em>profile&lt;/em>, &lt;em>email&lt;/em>, &lt;em>eduperson_entitlement&lt;/em> in the
&lt;strong>Scope&lt;/strong> field&lt;/li>
&lt;li>Enable &lt;em>authorization code&lt;/em> in the &lt;strong>Grant Types&lt;/strong> field&lt;/li>
&lt;li>Set &lt;em>Proof Key for Code Exchange (PKCE) Code Challenge Method&lt;/em> to &lt;em>SHA-256
hash algorithm (recommended)&lt;/em>&lt;/li>
&lt;li>Make sure &lt;em>Allow calls to the Introspection Endpoint?&lt;/em> is enabled in
&lt;strong>Introspection&lt;/strong> field&lt;/li>
&lt;/ul>
&lt;/blockquote>
&lt;/li>
&lt;/ul>
&lt;p>Submit the request for review by the Check-in operations team. Once the request
has been approved, you will get a client ID and client secret. Save them for the
following steps&lt;/p>
&lt;h2 id="keystone-setup">Keystone setup&lt;/h2>
&lt;h3 id="pre-requisites">Pre-requisites&lt;/h3>
&lt;ol>
&lt;li>Keystone must run as a WSGI application behind an HTTP server (Apache is used
in this documentation, but any server should be possible if it has OpenID
connect/OAuth2.0 support). Keystone project has deprecated eventlet, so you
should be already running Keystone in such way.&lt;/li>
&lt;li>Keystone must be run with SSL&lt;/li>
&lt;li>You need to install
&lt;a href="https://github.com/pingidentity/mod_auth_openidc">mod_auth_openidc&lt;/a> for
adding support for OpenID Connect to Apache.&lt;/li>
&lt;/ol>
&lt;div class="alert alert-info" role="alert">
&lt;h4 class="alert-heading">IGTF CAs&lt;/h4>
&lt;p>EGI monitoring checks that your
Keystone accepts clients with certificates from the IGTF CAs. Please ensure that
your server is configured with the correct Certificate and Revocation path:&lt;/p>
&lt;dl>
&lt;dt>For Apache HTTPd&lt;/dt>
&lt;dd>
&lt;p>HTTPd is able to use CAs and CRLs contained in a directory:&lt;/p>
&lt;/dd>
&lt;/dl>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ApacheConf" data-lang="ApacheConf">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">SSLCACertificatePath&lt;/span> &lt;span style="color:#4e9a06">/etc/grid-security/certificates&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">SSLCARevocationPath&lt;/span> &lt;span style="color:#4e9a06">/etc/grid-security/certificates&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;dl>
&lt;dt>For haproxy&lt;/dt>
&lt;dd>
&lt;p>CA and CRLS have to be bundled into one file.&lt;/p>
&lt;/dd>
&lt;/dl>
&lt;p>Client verification should be set as optional otherwise accepted CAs won't be
presented to the EGI monitoring:&lt;/p>
&lt;!-- markdownlint-disable line-length -->
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-plaintext" data-lang="plaintext">&lt;span style="display:flex;">&lt;span># crt: concatenated cert, key and CA
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># ca-file: all IGTF CAs, concatenated as one file
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># crl-file: all IGTF CRLs, concatenated as one file
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># verify: enable optional X.509 client authentication
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>bind XXX.XXX.XXX.XXX:443 ssl crt /etc/haproxy/certs/host-cert-with-key-and-ca.pem ca-file /etc/haproxy/certs/igtf-cas-bundle.pem crl-file /etc/haproxy/certs/igtf-crls-bundle.pem verify optional
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div> &lt;!-- markdownlint-enable line-length -->
&lt;dl>
&lt;dt>For nginx&lt;/dt>
&lt;dd>
&lt;p>CA and CRLS have to be bundled into one file.&lt;/p>
&lt;/dd>
&lt;/dl>
&lt;p>Client verification should be set as optional otherwise accepted CAs won't be
presented to the EGI monitoring:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-Nginx" data-lang="Nginx">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">ssl_client_certificate&lt;/span> &lt;span style="color:#4e9a06">/etc/ssl/certs/igtf-cas-bundle.pem&lt;/span>&lt;span style="color:#000;font-weight:bold">;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">ssl_crl&lt;/span> &lt;span style="color:#4e9a06">/etc/ssl/certs/igtf-crls-bundle.pem&lt;/span>&lt;span style="color:#000;font-weight:bold">;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">ssl_verify_client&lt;/span> &lt;span style="color:#4e9a06">optional&lt;/span>&lt;span style="color:#000;font-weight:bold">;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;dl>
&lt;dt>Managing IGTF CAs and CRLs&lt;/dt>
&lt;dd>
&lt;p>IGTF CAs can be obtained from UMD, you can find repository files for your
distribution at
&lt;a href="https://repository.egi.eu/sw/production/cas/1/current/">EGI CA repository&lt;/a>&lt;/p>
&lt;/dd>
&lt;/dl>
&lt;p>IGTF CAs and CRLs can be bundled using the examples command hereafter.&lt;/p>
&lt;p>Please update CAs bundle after IGTF updates, and CRLs bundle after each CRLs
update made by fetch-crl:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>cat /etc/grid-security/certificates/*.pem &amp;gt; /etc/haproxy/certs/igtf-cas-bundle.pem
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cat /etc/grid-security/certificates/*.r0 &amp;gt; /etc/haproxy/certs/igtf-crls-bundle.pem
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># Some CRLs files are not ending with a new line&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># Ensuring that CRLs markers are separated by a line feed&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>perl -pe &lt;span style="color:#4e9a06">&amp;#39;s/----------/-----\n-----/&amp;#39;&lt;/span> -i /etc/haproxy/certs/igtf-crls-bundle.pem
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;h2 id="apache-configuration">Apache Configuration&lt;/h2>
&lt;p>Include this configuration on the Apache config for the virtual host of your
Keystone service, using the client ID and secret obtained above:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ApacheConf" data-lang="ApacheConf">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">OIDCResponseType&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;code&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">OIDCClaimPrefix&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;OIDC-&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">OIDCClaimDelimiter&lt;/span> ;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">OIDCScope&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;openid profile email eduperson_entitlement&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">OIDCProviderMetadataURL&lt;/span> https://aai-demo.egi.eu/auth/realms/egi/.well-known/openid-configuration
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># PKCE method&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">OIDCPKCEMethod&lt;/span> S256
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">OIDCClientID&lt;/span> &amp;lt;client id&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">OIDCClientSecret&lt;/span> &amp;lt;client secret&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">OIDCCryptoPassphrase&lt;/span> &amp;lt;some crypto pass phrase&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">OIDCRedirectURI&lt;/span> https://&amp;lt;your keystone endpoint&amp;gt;/v3/auth/OS-FEDERATION/websso/openid/redirect
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># OAuth for CLI access&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">OIDCOAuthIntrospectionEndpoint&lt;/span> https://aai-demo.egi.eu/auth/realms/egi/protocol/openid-connect/token/introspect
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">OIDCOAuthClientID&lt;/span> &amp;lt;client id&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">OIDCOAuthClientSecret&lt;/span> &amp;lt;client secret&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># Increase Shm cache size for supporting long entitlements&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">OIDCCacheShmEntrySizeMax&lt;/span> &lt;span style="color:#0000cf;font-weight:bold">65536&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">&amp;lt;Location&lt;/span> &lt;span style="color:#4e9a06">~ &amp;#34;/v3/auth/OS-FEDERATION/websso/openid&amp;#34;&lt;/span>&lt;span style="color:#204a87;font-weight:bold">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87">AuthType&lt;/span> openid-connect
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87">Require&lt;/span> valid-user
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">&amp;lt;/Location&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">&amp;lt;Location&lt;/span> &lt;span style="color:#4e9a06">~ &amp;#34;/v3/OS-FEDERATION/identity_providers/egi.eu/protocols/openid/auth&amp;#34;&lt;/span>&lt;span style="color:#204a87;font-weight:bold">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87">Authtype&lt;/span> oauth20
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87">Require&lt;/span> valid-user
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">&amp;lt;/Location&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>If you have multiple keystone hosts, configure an alternative caching mechanism
as per &lt;a href="https://github.com/zmartzone/mod_auth_openidc/wiki/Caching">https://github.com/zmartzone/mod_auth_openidc/wiki/Caching&lt;/a>&lt;/p>
&lt;p>For example, using memcache&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ApacheConf" data-lang="ApacheConf">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">OIDCCacheType&lt;/span> memcache
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">OIDCMemCacheServers&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;memcache1 memcache2 memcache3&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Be sure to enable the &lt;code>mod_auth_oidc&lt;/code> module in Apache, in Ubuntu:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>sudo a2enmod auth_openidc
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;div class="alert alert-info" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
&lt;p>If running Keystone behind a proxy, make
sure to correctly set the X-Forwarded-Proto and X-Forwarded-Port request
headers, e.g. for haproxy:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-plaintext" data-lang="plaintext">&lt;span style="display:flex;">&lt;span>http-request set-header X-Forwarded-Proto https if { ssl_fc }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>http-request set-header X-Forwarded-Proto http if !{ ssl_fc }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>http-request set-header X-Forwarded-Port %[dst_port]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;h3 id="multiple-oidc-providers">Multiple OIDC providers&lt;/h3>
&lt;p>If your OpenStack deployment needs to support multiple identity providers
(besides EGI Check-in) you will need to configure &lt;code>mod_auth_openidc&lt;/code> to support
&lt;a href="https://github.com/zmartzone/mod_auth_openidc/wiki/Multiple-Providers#discovery">multiple providers&lt;/a>
and use an OAuth2.0 token introspection proxy like
&lt;a href="https://github.com/indigo-iam/esaco">ESACO&lt;/a>.&lt;/p>
&lt;h4 id="mod_auth_openidc-configuration">&lt;code>mod_auth_openidc&lt;/code> configuration&lt;/h4>
&lt;p>First, create a directory to host each of the providers configuration, in our
case we will use &lt;code>/var/lib/apache2/oidc/metadata&lt;/code>, but adapt this to your
specific needs. Ensure this directory is writable by the user running apache:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>mkdir -p /var/lib/apache2/oidc/metadata
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>chown -R www-data:www-data /var/lib/apache2/oidc/metadata
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Set in your Apache configuration the &lt;code>OIDCMetadataDir&lt;/code> pointing to that
directory&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ApacheConf" data-lang="ApacheConf">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">OIDCMetadataDir&lt;/span> &lt;span style="color:#4e9a06">/var/lib/apache2/oidc/metadata&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>You may remove the &lt;code>OIDCProviderMetadataURL&lt;/code>, &lt;code>OIDCClientID&lt;/code> and
&lt;code>OIDCClientSecret&lt;/code> options from the Apache configuration as these will be now
set in new files created in the metadata directory. For every provider you will
support, you need to create 3 files:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;code>&amp;lt;urlencoded-issuer-value-with-https-prefix-and-trailing-slash-stripped&amp;gt;.provider&lt;/code>
with the OpenID Connect Discovery OP JSON metadata. The easiest way to create
this file is getting its content from the OIDC server itself. For EGI
Check-in:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>curl https://aai-demo.egi.eu/auth/realms/egi/.well-known/openid-configuration &amp;gt; &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> /var/lib/apache2/oidc/metadata/aai-demo.egi.eu%2Foidc.provider
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>&lt;code>&amp;lt;urlencoded-issuer-value-with-https-prefix-and-trailing-slash-stripped&amp;gt;.client&lt;/code>
with the client credentials. For EGI Check-in
(&lt;code>aai-demo.egi.eu%2Foidc.client&lt;/code>):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;client_id&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;&amp;lt;your client id&amp;gt;&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;client_secret&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;&amp;lt;your secret id&amp;gt;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>&lt;code>&amp;lt;urlencoded-issuer-value-with-https-prefix-and-trailing-slash-stripped&amp;gt;.conf&lt;/code>
with any extra configuration for the provider. This may not be needed if all
your providers are similar. For example to specify the scopes to use for
Check-in, use a &lt;code>aai-demo.egi.eu%2Foidc.conf&lt;/code> as follows:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;scope&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;openid email profile eduperson_entitlement&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;pkce_method&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;S256&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;p>Now add for the providers you support new configuration in Apache to facilitate
the use of the dashboard. This is for a configuration of an &lt;code>egi.eu&lt;/code> identity
provider with &lt;code>openid&lt;/code> as protocol:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ApacheConf" data-lang="ApacheConf">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">&amp;lt;Location&lt;/span> &lt;span style="color:#4e9a06">~ &amp;#34;/v3/auth/OS-FEDERATION/identity_providers/egi.eu/protocols/openid/websso&amp;#34;&lt;/span>&lt;span style="color:#204a87;font-weight:bold">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87">AuthType&lt;/span> openid-connect
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8f5902;font-style:italic"># This is your Redirect URI with a new iss=&amp;lt;your idp iss&amp;gt; option added&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87">OIDCDiscoverURL&lt;/span> https://&amp;lt;your keystone endpoint&amp;gt;/v3/auth/OS-FEDERATION/websso/openid/redirect?iss=https%3A%2F%2Faai-demo.egi.eu%2Foidc%2F
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8f5902;font-style:italic"># Ensure that the user is authenticated with the expected iss&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87">Require&lt;/span> claim iss:https://aai-demo.egi.eu/auth/realms/egi
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87">Require&lt;/span> valid-user
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">&amp;lt;/Location&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="esaco-configuration">ESACO configuration&lt;/h4>
&lt;p>ESACO will handle OAuth tokens when users hit your Keystone from API/CLI. It
needs to run as a daemon that listens (by default) on port 8156. We will use
docker for facilitating the deployment:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Create a yaml file with the configuration of the different providers
(&lt;code>application.yaml&lt;/code>):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">oidc&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">clients&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>- &lt;span style="color:#204a87;font-weight:bold">issuer-url&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">https://aai-demo.egi.eu/auth/realms/egi&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">client-id&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&amp;lt;your check-in client id&amp;gt;&amp;#34;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">client-secret&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&amp;lt;your check-in client secret&amp;gt;&amp;#34;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>- &lt;span style="color:#204a87;font-weight:bold">issuer-url&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">&amp;lt;another idp&amp;gt;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">client-id&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&amp;lt;your client id for second idp&amp;gt;&amp;#34;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">client-secret&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&amp;lt;your client secret for second idp&amp;gt;&amp;#34;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Create a environment file with the ESACO credentials you want to use
(&lt;code>esaco.env&lt;/code>):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># User name credential requested from clients introspecting tokens&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">ESACO_USER_NAME&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&amp;lt;esaco user name&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># Password credential requested from clients introspecting tokens&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">ESACO_USER_PASSWORD&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&amp;lt;esaco password&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Run the ESACO server (adapt this as it better fits to run on your servers and
make it run permanently):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>docker run -p 8156:8156 -d -env-file&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>esaco.env &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -v application.yml:/esaco/config/application.yml:ro &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> indigoiam/esaco:latest
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Configure Keystone&amp;rsquo;s Apache to use ESACO as OAuth introspection endpoint:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ApacheConf" data-lang="ApacheConf">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># point this to the host where ESACO is running&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">OIDCOAuthIntrospectionEndpoint&lt;/span> http://localhost:8156/introspect
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">OIDCOAuthClientID&lt;/span> &amp;lt;esaco &lt;span style="color:#204a87;font-weight:bold">user&lt;/span> name&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">OIDCOAuthClientSecret&lt;/span> &amp;lt;esaco password&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">OIDCIDTokenIatSlack&lt;/span> &lt;span style="color:#0000cf;font-weight:bold">3600&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Configure also the locations in Apache that should use OAuth:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ApacheConf" data-lang="ApacheConf">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">&amp;lt;Location&lt;/span> &lt;span style="color:#4e9a06">~ &amp;#34;/v3/OS-FEDERATION/identity_providers/egi.eu/protocols/openid/auth&amp;#34;&lt;/span>&lt;span style="color:#204a87;font-weight:bold">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87">Authtype&lt;/span> oauth20
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87">Require&lt;/span> valid-user
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">&amp;lt;/Location&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">&amp;lt;Location&lt;/span> &lt;span style="color:#4e9a06">~ &amp;#34;/v3/OS-FEDERATION/identity_providers/other_idp/protocols/openid/auth&amp;#34;&lt;/span>&lt;span style="color:#204a87;font-weight:bold">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87">Authtype&lt;/span> oauth20
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87">Require&lt;/span> valid-user
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">&amp;lt;/Location&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;h4 id="horizon-configuration">Horizon configuration&lt;/h4>
&lt;p>In your Horizon configuration, set the list of providers and their mappings:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># this is the list that will show up in the dropdown menu&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">WEBSSO_CHOICES&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#000;font-weight:bold">(&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;credentials&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">_&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;Keystone Credentials&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">)),&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;egi.eu&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">_&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;EGI Check-in&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">)),&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;other-idp&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">_&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;Other IdP&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">)),&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># this maps the options above to keystone&amp;#39;s idps and protocols&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">WEBSSO_IDP_MAPPING&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;egi.eu&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;egi.eu&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;openid&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">),&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;other-idp&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;other-idp.com&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;openid&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="keystone-configuration">Keystone Configuration&lt;/h2>
&lt;p>Configure your &lt;code>keystone.conf&lt;/code> to include in the &lt;code>[auth]&lt;/code> section &lt;code>openid&lt;/code> in
the list of authentication methods:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ini" data-lang="ini">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">[auth]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># This may change in your installation&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># add openid to the list of the methods you support&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#c4a000">methods&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">password, token, openid&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Add a &lt;code>[openid]&lt;/code> section as follows:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ini" data-lang="ini">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">[openid]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># this is the attribute in the Keystone environment that will define the&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># identity provider&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#c4a000">remote_id_attribute&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">HTTP_OIDC_ISS&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Add your horizon host as trusted dashboard to the &lt;code>[federation]&lt;/code> section:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ini" data-lang="ini">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">[federation]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#c4a000">trusted_dashboard&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">https://&amp;lt;your horizon&amp;gt;/dashboard/auth/websso/&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Finally copy the default template for managing the tokens in horizon to
&lt;code>/etc/keystone/sso_callback_template.html&lt;/code>. This template can be found in
keystone git repository at
&lt;code>https://github.com/openstack/keystone/blob/master/etc/sso_callback_template.html&lt;/code>&lt;/p>
&lt;!-- markdownlint-disable line-length -->
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>curl -L https://raw.githubusercontent.com/openstack/keystone/master/etc/sso_callback_template.html &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> &amp;gt; /etc/keystone/sso_callback_template.html
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;!-- markdownlint-enable line-length -->
&lt;p>Now restart your Apache (and Keystone if running in uwsgi) so you can configure
the Keystone Federation support.&lt;/p>
&lt;h2 id="keystone-federation-support">Keystone Federation Support&lt;/h2>
&lt;p>First, create a new &lt;code>egi.eu&lt;/code> identity provider with remote id
&lt;code>https://aai-demo.egi.eu/auth/realms/egi&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>$ openstack identity provider create --remote-id https://aai-demo.egi.eu/auth/realms/egi egi.eu
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>+-------------+-----------------------------------------+
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">|&lt;/span> Field &lt;span style="color:#000;font-weight:bold">|&lt;/span> Value &lt;span style="color:#000;font-weight:bold">|&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>+-------------+-----------------------------------------+
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">|&lt;/span> description &lt;span style="color:#000;font-weight:bold">|&lt;/span> None &lt;span style="color:#000;font-weight:bold">|&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">|&lt;/span> domain_id &lt;span style="color:#000;font-weight:bold">|&lt;/span> 1cac7817dafb4740a249cc9ca6b14ea5 &lt;span style="color:#000;font-weight:bold">|&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">|&lt;/span> enabled &lt;span style="color:#000;font-weight:bold">|&lt;/span> True &lt;span style="color:#000;font-weight:bold">|&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">|&lt;/span> id &lt;span style="color:#000;font-weight:bold">|&lt;/span> egi.eu &lt;span style="color:#000;font-weight:bold">|&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">|&lt;/span> remote_ids &lt;span style="color:#000;font-weight:bold">|&lt;/span> https://aai-demo.egi.eu/auth/realms/egi &lt;span style="color:#000;font-weight:bold">|&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>+-------------+-----------------------------------------+
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Check the name of the egi.eu domain name:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>$ openstack domain show -f value -c name &lt;span style="color:#204a87;font-weight:bold">$(&lt;/span>openstack identity provider show -f value -c domain_id egi.eu&lt;span style="color:#204a87;font-weight:bold">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Set the name to egi.eu (if it was set to random auto-generated number):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>$ openstack domain &lt;span style="color:#204a87">set&lt;/span> --name egi.eu &lt;span style="color:#204a87;font-weight:bold">$(&lt;/span>openstack identity provider show -f value -c domain_id egi.eu&lt;span style="color:#204a87;font-weight:bold">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Create a group and add a domain-wide role for auditing purposes (see below):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># Support for https://operations-portal.egi.eu/vo/view/voname/cloud.egi.eu&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ openstack group create --domain egi.eu egi-staff
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ openstack role add --domain egi.eu --group egi-staff reader
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Every VO you want to support should be mapped to a local project. The &lt;code>ops&lt;/code> VO
is used by &lt;a href="../../../../internal/monitoring/">EGI monitoring&lt;/a> to ensure the correct
functioning of your site. Create a group for this vo and add the group as a
member of it:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># Support for https://operations-portal.egi.eu/vo/view/voname/ops&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ openstack group create ops
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ openstack role add --domain egi.eu --group ops --project &amp;lt;your &lt;span style="color:#204a87">local&lt;/span> ops project&amp;gt; member
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Now you can define the mapping of EGI Check-in users into the groups you just
created and restrict with the &lt;code>OIDC-eduperson_entitlement&lt;/code> attribute which users
will be members of those groups. Substitute the group IDs to the adequate values
for your deployment:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>$ cat mapping.egi.json
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ce5c00;font-weight:bold">[&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ce5c00;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;local&amp;#34;&lt;/span>: &lt;span style="color:#ce5c00;font-weight:bold">[&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ce5c00;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;user&amp;#34;&lt;/span>: &lt;span style="color:#ce5c00;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;name&amp;#34;&lt;/span>: &lt;span style="color:#4e9a06">&amp;#34;{0}&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;email&amp;#34;&lt;/span>: &lt;span style="color:#4e9a06">&amp;#34;{1}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ce5c00;font-weight:bold">}&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;group&amp;#34;&lt;/span>: &lt;span style="color:#ce5c00;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#4e9a06">&amp;#34;_ops_group_ID_&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ce5c00;font-weight:bold">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ce5c00;font-weight:bold">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ce5c00;font-weight:bold">]&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;remote&amp;#34;&lt;/span>: &lt;span style="color:#ce5c00;font-weight:bold">[&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ce5c00;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;type&amp;#34;&lt;/span>: &lt;span style="color:#4e9a06">&amp;#34;HTTP_OIDC_SUB&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ce5c00;font-weight:bold">}&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ce5c00;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;type&amp;#34;&lt;/span>: &lt;span style="color:#4e9a06">&amp;#34;HTTP_OIDC_EMAIL&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ce5c00;font-weight:bold">}&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ce5c00;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;type&amp;#34;&lt;/span>: &lt;span style="color:#4e9a06">&amp;#34;HTTP_OIDC_ISS&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;any_one_of&amp;#34;&lt;/span>: &lt;span style="color:#ce5c00;font-weight:bold">[&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;https://aai-demo.egi.eu/auth/realms/egi&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ce5c00;font-weight:bold">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ce5c00;font-weight:bold">}&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ce5c00;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;type&amp;#34;&lt;/span>: &lt;span style="color:#4e9a06">&amp;#34;OIDC-eduperson_entitlement&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;regex&amp;#34;&lt;/span>: true,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;any_one_of&amp;#34;&lt;/span>: &lt;span style="color:#ce5c00;font-weight:bold">[&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;^urn:mace:egi.eu:group:ops:role=vm_operator#aai.egi.eu&lt;/span>$&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ce5c00;font-weight:bold">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ce5c00;font-weight:bold">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ce5c00;font-weight:bold">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ce5c00;font-weight:bold">}&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ce5c00;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;local&amp;#34;&lt;/span>: &lt;span style="color:#ce5c00;font-weight:bold">[&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ce5c00;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;user&amp;#34;&lt;/span>: &lt;span style="color:#ce5c00;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;name&amp;#34;&lt;/span>: &lt;span style="color:#4e9a06">&amp;#34;{0}&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;email&amp;#34;&lt;/span>: &lt;span style="color:#4e9a06">&amp;#34;{1}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ce5c00;font-weight:bold">}&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;group&amp;#34;&lt;/span>: &lt;span style="color:#ce5c00;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#4e9a06">&amp;#34;_egi-staff_group_ID_&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ce5c00;font-weight:bold">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ce5c00;font-weight:bold">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ce5c00;font-weight:bold">]&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;remote&amp;#34;&lt;/span>: &lt;span style="color:#ce5c00;font-weight:bold">[&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ce5c00;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;type&amp;#34;&lt;/span>: &lt;span style="color:#4e9a06">&amp;#34;HTTP_OIDC_SUB&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ce5c00;font-weight:bold">}&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ce5c00;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;type&amp;#34;&lt;/span>: &lt;span style="color:#4e9a06">&amp;#34;HTTP_OIDC_EMAIL&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ce5c00;font-weight:bold">}&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ce5c00;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;type&amp;#34;&lt;/span>: &lt;span style="color:#4e9a06">&amp;#34;HTTP_OIDC_ISS&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;any_one_of&amp;#34;&lt;/span>: &lt;span style="color:#ce5c00;font-weight:bold">[&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;https://aai.egi.eu/auth/realms/egi&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ce5c00;font-weight:bold">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ce5c00;font-weight:bold">}&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ce5c00;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;type&amp;#34;&lt;/span>: &lt;span style="color:#4e9a06">&amp;#34;OIDC-eduperson_entitlement&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;regex&amp;#34;&lt;/span>: true,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;any_one_of&amp;#34;&lt;/span>: &lt;span style="color:#ce5c00;font-weight:bold">[&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;^urn:mace:egi.eu:group:cloud.egi.eu:role=auditor#aai.egi.eu&lt;/span>$&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ce5c00;font-weight:bold">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ce5c00;font-weight:bold">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ce5c00;font-weight:bold">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ce5c00;font-weight:bold">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ce5c00;font-weight:bold">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;div class="alert alert-Info" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
Note the use of the &lt;code>HTTP_OIDC_EMAIL&lt;/code> in
the mapping will allow to store the user&amp;rsquo;s email in your local
database.
&lt;/div>
&lt;p>Create the mapping in Keystone:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>$ openstack mapping create --rules mapping.egi.json egi-mapping
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Finally, create the federated protocol with the identity provider and mapping
created before:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>$ openstack federation protocol create &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --identity-provider egi.eu &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --mapping egi-mapping openid
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>+-------------------+-------------+
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">|&lt;/span> Field &lt;span style="color:#000;font-weight:bold">|&lt;/span> Value &lt;span style="color:#000;font-weight:bold">|&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>+-------------------+-------------+
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">|&lt;/span> id &lt;span style="color:#000;font-weight:bold">|&lt;/span> openid &lt;span style="color:#000;font-weight:bold">|&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">|&lt;/span> identity_provider &lt;span style="color:#000;font-weight:bold">|&lt;/span> egi.eu &lt;span style="color:#000;font-weight:bold">|&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">|&lt;/span> mapping &lt;span style="color:#000;font-weight:bold">|&lt;/span> egi-mapping &lt;span style="color:#000;font-weight:bold">|&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>+-------------------+-------------+
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Keystone is now ready to accept EGI Check-in credentials.&lt;/p>
&lt;h3 id="vo-auditing">VO auditing&lt;/h3>
&lt;p>Sometimes it is easy to leave behind Virtual Machines that are no longer used,
consuming unnecessary resources. Owners of unused VMs should be notified to
check whether occupied resources can be freed.&lt;/p>
&lt;p>EGI Check-in users get an &lt;code>ePUID&lt;/code> (i.e. a long hash ending in &lt;code>@egi.eu&lt;/code>) which
are translated into local OpenStack user IDs. When VMs are created the owner of
the VM is set to the OpenStack user ID instead of the &lt;code>ePUID&lt;/code>. However, only the
&lt;code>ePUID&lt;/code> is linked to the user email in order for the user to be notified. The
mapping between OpenStack user IDs and &lt;code>ePUIDs&lt;/code> is shown with:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>$ openstack user list
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Problem is that regular users will not have the permissions to execute the
command above. The steps above to configure a mapping for the &lt;code>cloud.egi.eu&lt;/code> VO
grant access to selected staff at EGI.eu to execute the command, using the
default keystone policy:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;identity:list_users&amp;#34;&lt;/span>&lt;span style="color:#a40000">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;(role:reader and system_scope:all) or (role:reader and domain_id:%(target.domain_id)s)&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This has been tested in production on OpenStack Ussuri thanks to the
collaboration between EGI.eu and IISAS-Fedcloud. It should also work with newer
versions of OpenStack.&lt;/p>
&lt;p>EGI.eu staff belonging to the &lt;code>cloud.egi.eu&lt;/code> VO having the auditor role should
use the below setup to get the OpenStack user list:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">export&lt;/span> &lt;span style="color:#000">OS_INTERFACE&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>public
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># get OS_AUTH_URL with &amp;#34;fedcloud site env --vo &amp;lt;vo&amp;gt; --site &amp;lt;site&amp;gt;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">export&lt;/span> &lt;span style="color:#000">OS_AUTH_URL&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>https://cloud.ui.savba.sk:5000/v3
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">export&lt;/span> &lt;span style="color:#000">OS_USERNAME&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&amp;lt;ePUID&amp;gt; &lt;span style="color:#8f5902;font-style:italic"># get it from https://aai.egi.eu/&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">export&lt;/span> &lt;span style="color:#000">OS_IDENTITY_PROVIDER&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>egi.eu
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">export&lt;/span> &lt;span style="color:#000">OS_AUTH_TYPE&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>v3oidcaccesstoken
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">export&lt;/span> &lt;span style="color:#000">OS_PROTOCOL&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>openid
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">export&lt;/span> &lt;span style="color:#000">OS_IDENTITY_API_VERSION&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#0000cf;font-weight:bold">3&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># get OS_ACCESS_TOKEN following https://docs.egi.eu/users/aai/check-in/obtaining-tokens/&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">export&lt;/span> &lt;span style="color:#000">OS_ACCESS_TOKEN&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&amp;lt;token&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">export&lt;/span> &lt;span style="color:#000">OS_DOMAIN_NAME&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>egi.eu
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ openstack user list
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>With this configuration EGI.eu staff is able to proactively notify creators of
long-running VMs that may not be making an effective use of the cloud resources.&lt;/p>
&lt;h3 id="additional-vos">Additional VOs&lt;/h3>
&lt;p>To configure additional VOs please follow steps in the
&lt;a href="../vo-config/">VO Configuration guide&lt;/a>.&lt;/p>
&lt;h2 id="horizon-configuration-1">Horizon Configuration&lt;/h2>
&lt;p>Edit your local_settings.py to include the following values:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># Enables keystone web single-sign-on if set to True.&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">WEBSSO_ENABLED&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#204a87;font-weight:bold">True&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># Allow users to choose between local Keystone credentials or login&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># with EGI Check-in&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">WEBSSO_CHOICES&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#000;font-weight:bold">(&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;credentials&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">_&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;Keystone Credentials&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">)),&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;openid&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">_&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;EGI Check-in&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">)),&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Once horizon is restarted you will be able to choose &amp;quot;EGI Check-in&amp;quot; for login.&lt;/p>
&lt;h2 id="cli-access">CLI Access&lt;/h2>
&lt;p>The
&lt;a href="https://docs.openstack.org/developer/python-openstackclient/">OpenStack Client&lt;/a>
has built-in support for using OpenID Connect Access Tokens to authenticate. You
first need to get a valid Access Token from EGI Check-in (e.g. from
&lt;a href="https://aai-demo.egi.eu/token/">https://aai-demo.egi.eu/token/&lt;/a>) and then use it in a command like:&lt;/p>
&lt;!-- markdownlint-disable line-length -->
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>$ openstack --os-auth-url https://&amp;lt;your keystone endpoint&amp;gt;/v3 &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --os-auth-type v3oidcaccesstoken --os-protocol openid &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --os-identity-provider egi.eu &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --os-access-token &amp;lt;your access token&amp;gt; &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> token issue
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>+---------+---------------------------------------------------------------------------------------+
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">|&lt;/span> Field &lt;span style="color:#000;font-weight:bold">|&lt;/span> Value &lt;span style="color:#000;font-weight:bold">|&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>+---------+---------------------------------------------------------------------------------------+
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">|&lt;/span> expires &lt;span style="color:#000;font-weight:bold">|&lt;/span> 2017-05-23T11:24:31+0000 &lt;span style="color:#000;font-weight:bold">|&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">|&lt;/span> id &lt;span style="color:#000;font-weight:bold">|&lt;/span> gAAAAABZJA3fbKX....nEMAPi-IsFOCkU9QWGTISYElzYJsI3z0SJGs7QsTJv4aJQq0JDJUBz6uE85SqXDj3 &lt;span style="color:#000;font-weight:bold">|&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">|&lt;/span> user_id &lt;span style="color:#000;font-weight:bold">|&lt;/span> 020864ea9415413f9d706f6b473dbeba &lt;span style="color:#000;font-weight:bold">|&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>+---------+---------------------------------------------------------------------------------------+
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;!-- markdownlint-enable line-length -->
&lt;h2 id="moving-to-egi-check-in-production-instance">Moving to EGI Check-in production instance&lt;/h2>
&lt;p>Once tests in the development instance of Check-in are successful, you can move
to the production instance. Go to
&lt;a href="https://aai.egi.eu/federation">EGI Federation Registry&lt;/a> and submit a Service
Request for the production instance of EGI Check-in. After the approval of the
request, you will need to update your configuration as follows:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>Update the &lt;code>remote-id&lt;/code> of the identity provider:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>openstack identity provider &lt;span style="color:#204a87">set&lt;/span> --remote-id https://aai.egi.eu/auth/realms/egi egi.eu
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Update the &lt;code>HTTP_OIDC_ISS&lt;/code> filter in your mappings, e.g.:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>sed -i &lt;span style="color:#4e9a06">&amp;#39;s/aai-demo.egi.eu/aai.egi.eu/&amp;#39;&lt;/span> mapping.egi.json
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>openstack mapping &lt;span style="color:#204a87">set&lt;/span> --rules mapping.egi.json egi-mapping
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Update Apache configuration to use &lt;code>aai.egi.eu&lt;/code> instead of &lt;code>aai-demo.egi.eu&lt;/code>,
if you have multiple OIDC providers, you should as well update the providers
metadata and ESACO configuration. For the basic Apache configuration you
should set these values:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ApacheConf" data-lang="ApacheConf">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">OIDCProviderMetadataURL&lt;/span> https://aai.egi.eu/auth/realms/egi/.well-known/openid-configuration
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">OIDCOAuthIntrospectionEndpoint&lt;/span> https://aai.egi.eu/auth/realms/egi/protocol/openid-connect/token/introspect
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;div class="alert alert-info" role="alert">
&lt;h4 class="alert-heading">Changes in the client settings&lt;/h4>
If you want to
make any changes to the client configuration, you need to submit a
reconfiguration request through the
&lt;a href="https://aai.egi.eu/federation">Federation Registry&lt;/a>.
&lt;/div>
&lt;h3 id="additional-vos-1">Additional VOs&lt;/h3>
&lt;p>Once &lt;code>ops&lt;/code> VO is working, you can include any further VOs you want to support as
documented in the &lt;a href="../vo-config">VO Configuration guide&lt;/a>.&lt;/p></description></item><item><title>Providers: Accounting</title><link>/providers/cloud-compute/openstack/accounting/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/providers/cloud-compute/openstack/accounting/</guid><description>
&lt;p>There are two different processes handling the accounting integration:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/IFCA-Advanced-Computing/caso/">cASO&lt;/a>, which connects
to the OpenStack services to get the usage information, and,&lt;/li>
&lt;li>&lt;a href="https://github.com/apel/ssm">ssmsend&lt;/a>, which sends that usage information
to the central EGI accounting repository.&lt;/li>
&lt;/ul>
&lt;h3 id="installation">Installation&lt;/h3>
&lt;p>You can get cASO from the
&lt;a href="https://github.com/IFCA-Advanced-Computing/caso/releases">releases page&lt;/a>,
alternatively a container image is available in the
&lt;a href="https://github.com/EGI-Federation/fedcloud-catchall-operations/pkgs/container/fedcloud-caso">fedcloud-caso&lt;/a>
repository.&lt;/p>
&lt;p>SSM is also available in the &lt;a href="https://github.com/apel/ssm/releases">releases&lt;/a>
or as a container in the &lt;a href="https://github.com/apel/ssm/releases">ssm&lt;/a> repository&lt;/p>
&lt;h3 id="configuration">Configuration&lt;/h3>
&lt;p>&lt;a href="https://caso.readthedocs.org/en/latest/configuration.html">cASO configuration&lt;/a>
is stored at &lt;code>/etc/caso/caso.conf&lt;/code>. Most default values should be OK, but you
must set:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;code>site_name&lt;/code> (line 12), with the name of your site as defined in GOCDB.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>credentials to access the OpenStack services to extract accounting data.
Check
&lt;a href="https://caso.readthedocs.org/en/latest/configuration.html#openstack-configuration">cASO documentation&lt;/a>
for the expected permissions of the user configured here.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>cASO will discover the projects from OpenStack using tags and properties.
You can set specific tags and properties as needed as described in the
&lt;a href="https://caso.readthedocs.io/en/stable/configuration.html#selecting-projects-to-get-usages">Documentation&lt;/a>.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>cASO will write records to &lt;code>/var/spool/apel&lt;/code> from where ssmsend will take them.&lt;/p>
&lt;p>SSM configuration is available at &lt;code>/etc/apel&lt;/code>. Set the destination to
&lt;code>eu-egi-cloud-accounting&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ini" data-lang="ini">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">[messaging]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># If using AMS this is the project that SSM will connect to. Ignored for STOMP.&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#c4a000">ams_project: accounting&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># Queue to which SSM will send messages&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#c4a000">destination: eu-egi-cloud-accounting&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Other default values available in the configuration file should be ok
for your site. SSM expects &lt;code>/etc/grid-security&lt;/code> to contain the host certificate
(&lt;code>/etc/grid-security/hostcert.pem&lt;/code>), private key
(&lt;code>/etc/grid-security/hostkey.pem&lt;/code>) and CAs (&lt;code>/etc/grid-security/certificates&lt;/code>).&lt;/p>
&lt;h4 id="running-the-services">Running the services&lt;/h4>
&lt;p>Both caso and ssmsend should run periodically, e.g. with a cron job, at least
once a day. We recommend running them every 4 hours.&lt;/p></description></item><item><title>Providers: Catch-all components</title><link>/providers/cloud-compute/openstack/catch-all/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/providers/cloud-compute/openstack/catch-all/</guid><description>
&lt;p>EGI manages the operations of two components for the sites so you don&amp;rsquo;t need
to do it:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>the information discovery provides a view about the actual images and
flavors available at the OpenStack for the federation users.
It runs as a single python application
&lt;a href="https://github.com/EGI-Federation/cloud-info-provider">cloud-info-provider&lt;/a>
that pushes information through the
&lt;a href="../../../../internal/messaging/">Messaging Service&lt;/a>.&lt;/p>
&lt;div class="alert alert-info" role="alert">
&lt;h4 class="alert-heading">BDII is deprecated&lt;/h4>
Cloud providers no longer
need to provide BDII as the Argo Messaging Service is used instead for
transferring information
&lt;/div>
&lt;/li>
&lt;li>
&lt;p>the &lt;code>image-sync&lt;/code> makes sure that images available in &lt;a href="https://registry.egi.eu">EGI&amp;rsquo;s Artefact Registry&lt;/a>
are available for your users in glance.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>The deployment and configuration of these components is managed a the&lt;/p>
&lt;!-- cspell:disable-next-line -->
&lt;p>&lt;a href="https://github.com/EGI-Federation/fedcloud-catchall-operations/">EGI-Federation/fedcloud-catchall-operations repository&lt;/a>.
Every provider should have a single &lt;code>yaml&lt;/code> file that describes its configuration
as follows:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">endpoint&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">&amp;lt;your endpoint as declared in GOCDB&amp;gt;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">gocdb&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">&amp;lt;your site name as declared in GOCDB&amp;gt;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">images&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">sync&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">true&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#8f5902;font-style:italic"># optionally list the formats that your site supports/prefers (as supported by qemu)&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#8f5902;font-style:italic"># if not specified, the sync will assume all formats are supported&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">formats&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>- &lt;span style="color:#000">qcow2&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>- &lt;span style="color:#000">raw&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">vos&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#8f5902;font-style:italic"># a list of VOs you support in your deployment as follows&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>- &lt;span style="color:#204a87;font-weight:bold">auth&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">project_id&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">&amp;lt;local OpenStack project identifier&amp;gt;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">name&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">&amp;lt;name of the vo&amp;gt;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>- &lt;span style="color:#204a87;font-weight:bold">auth&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">project_id&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">&amp;lt;local OpenStack project identifier for second VO&amp;gt;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">name&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">&amp;lt;name of another vo&amp;gt;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>You can create
&lt;a href="https://github.com/EGI-Federation/fedcloud-catchall-operations/pulls">pull requests&lt;/a>
for adding and maintaining your site configuration to the catch-all operations. As
soon as the pull request is merged, a new deployment will be triggered and your site
should start publishing information and syncing images.&lt;/p>
&lt;p>The catch-all operations uses a service account user, this user is member of the &lt;code>ops&lt;/code> VO
and should be enabled to manage VM images in glance.&lt;/p>
&lt;h2 id="opting-out-of-catch-all-operations">Opting out of catch-all operations&lt;/h2>
&lt;p>You can completely opt-out from the catch-all operations by removing your site
configuration from the repository. However, this will make your site not discoverable
by fedcloudclient or Infrastructure Manager.&lt;/p>
&lt;p>You can also disable the image sync by setting &lt;code>images.sync&lt;/code> to &lt;code>false&lt;/code> or by completely
removing the &lt;code>images&lt;/code> configuration. In that case, monitoring probes may fall as they rely
on the images being present at the site.&lt;/p>
&lt;p>Individual components are available in GitHub if you want to operate them by your own:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/EGI-Federation/cloud-info-provider">&lt;code>cloud-info-provider&lt;/code>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/EGI-Federation/atrope">&lt;code>atrope&lt;/code>&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Providers: GPU flavours</title><link>/providers/cloud-compute/openstack/gpu/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/providers/cloud-compute/openstack/gpu/</guid><description>
&lt;h2 id="setting-up-gpu-flavours">Setting up GPU flavours&lt;/h2>
&lt;p>Support for GPU can be added to flavours using the
&lt;a href="https://docs.openstack.org/nova/xena/admin/pci-passthrough.html">PCI passthrough feature in OpenStack&lt;/a>.
This allows to plug any kind of PCI device to the Virtual Machines.&lt;/p>
&lt;p>As a summary of the OpenStack documentation, these are the steps needed to add a
GPU enabled flavour (be aware this may need tuning to your specific
hardware/configuration!):&lt;/p>
&lt;ol>
&lt;li>On computing node, get vendor/product ID of your hardware:
&lt;code>lspci | grep NVIDIA&lt;/code> to get pci slot of GPU, then
&lt;code>virsh nodedev-dumpxml pci_xxxx_xx_xx_x&lt;/code>&lt;/li>
&lt;li>On computing node, unbind device from host kernel driver. Unbinding is system
dependent, and can be done in many ways, e.g.:
&lt;ul>
&lt;li>if the kernel does not uses the devices (no GPU drivers included in kernel,
or drivers disable in GRUB), nothing to unbind&lt;/li>
&lt;li>via pci-stub
&lt;code>grubby --args=&amp;quot;pci-stub.ids=10de:11fa&amp;quot; --update-kernel DEFAULT&lt;/code> (see
&lt;a href="https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html-single/configuring_and_managing_virtualization/index#proc_assigning-a-gpu-to-a-virtual-machine_assembly_managing-gpu-devices-in-virtual-machines">RedHat manual, section 12.1, step 1-2&lt;/a>;
where the &lt;code>pci-stub.ids&lt;/code> value is &lt;code>vendor_ID: product_id&lt;/code> from &lt;code>lspci&lt;/code>.&lt;/li>
&lt;li>via echo command: &lt;code>echo $dev &amp;gt; /sys/bus/pci/devices/$dev/driver/unbind&lt;/code>
where &lt;code>$dev&lt;/code> is the PCI device ID &lt;code>xx:xx.x&lt;/code> or &lt;code>xxxx:xx:xx.x&lt;/code> from &lt;code>lspci&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>On computing node, add
&lt;code>pci_passthrough_whitelist = {&amp;quot;vendor_id&amp;quot;:&amp;quot;xxxx&amp;quot;,&amp;quot;product_id&amp;quot;:&amp;quot;xxxx&amp;quot;}&lt;/code> to
&lt;code>nova.conf&lt;/code> (see
&lt;a href="https://docs.openstack.org/nova/xena/admin/pci-passthrough.html#configure-nova-compute">nova-compute&lt;/a>)&lt;/li>
&lt;li>On controller node, add
&lt;code>pci_alias = {&amp;quot;vendor_id&amp;quot;:&amp;quot;xxxx&amp;quot;,&amp;quot;product_id&amp;quot;:&amp;quot;xxxx&amp;quot;, &amp;quot;name&amp;quot;:&amp;quot;GPU&amp;quot;}&lt;/code> to
&lt;code>nova.conf&lt;/code> (see
&lt;a href="https://docs.openstack.org/nova/xena/admin/pci-passthrough.html#configure-nova-scheduler">nova-api&lt;/a>)&lt;/li>
&lt;li>On controller node, enable &lt;code>PciPassthroughFilter&lt;/code> in the scheduler (see
&lt;a href="https://docs.openstack.org/nova/xena/admin/pci-passthrough.html#configure-nova-scheduler">nova-scheduler&lt;/a>)&lt;/li>
&lt;li>Create new flavours with &lt;code>pci_passthrough:alias&lt;/code> (or add key to existing
flavour), e.g.
&lt;code>openstack flavor set m1.large --property &amp;quot;pci_passthrough:alias&amp;quot;=&amp;quot;GPU:2&amp;quot;&lt;/code>&lt;/li>
&lt;/ol>
&lt;h2 id="gpu-description-in-flavour-metadata">GPU description in flavour metadata&lt;/h2>
&lt;p>Users should be able to easily discover the flavours that provide GPUs (or
accelerators in general). The following table describes the agreed metadata for
EGI providers to add to those flavours:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Metadata&lt;/th>
&lt;th>Definition&lt;/th>
&lt;th>Comments&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Accelerator:Type&lt;/td>
&lt;td>Type of accelerator (e.g. &lt;code>GPU&lt;/code>)&lt;/td>
&lt;td>Possible values: &lt;code>GPU&lt;/code>, &lt;code>MIC&lt;/code>, &lt;code>FPGA&lt;/code>, &lt;code>TPU&lt;/code>, &lt;code>NPU&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Accelerator:Number&lt;/td>
&lt;td>Number of accelerators available in the flavour (e.g. &lt;code>1.0&lt;/code>)&lt;/td>
&lt;td>Non integers allowed for the case of sharing GPU between VMs&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Accelerator:Vendor&lt;/td>
&lt;td>Name of accelerator Vendor (e.g. &lt;code>NVIDIA&lt;/code>)&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Accelerator:Model&lt;/td>
&lt;td>Model of accelerator (e.g. &lt;code>Tesla V100&lt;/code>)&lt;/td>
&lt;td>Need to make consensus and enforce. A100 is usually marketed without &amp;ldquo;Tesla&amp;rdquo; class name. Similarly, RTX A6000 usually marketed without “GeForce”. For clarity, full names should be used: “Tesla A100” and “GeForce RTX A6000”&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Accelerator:Version&lt;/td>
&lt;td>Version of the accelerator&lt;/td>
&lt;td>Some cards have different versions, e.g. A100 PCIe and NVLink. Openstack does not allow empty value, so we should give 0 if no version is specified&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Accelerator:Memory&lt;/td>
&lt;td>RAM in GB of the accelerator&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Accelerator:VirtualizationType&lt;/td>
&lt;td>Type of virtualisation used (e.g. &lt;code>PCI passthrough&lt;/code>)&lt;/td>
&lt;td>Not relevant for accounting, but may be still useful in some cases&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>There are some extra fields that are defined in the GLUE2.1 schema but not so
relevant for GPUs and therefore not considered at the moment. These are listed
below for completeness:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Metadata&lt;/th>
&lt;th>Definition&lt;/th>
&lt;th>Comments&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Accelerator:ComputeCapability&lt;/td>
&lt;td>Compute capabilities&lt;/td>
&lt;td>Defined by GLUE2.1, e.g. floating point type, NVLink, &amp;hellip; may be used informally so far&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Accelerator:ClockSpeed&lt;/td>
&lt;td>Clockspeed of accelerator&lt;/td>
&lt;td>Defined by GLUE2.1, not so relevant, as ClockSpeed no longer related to performance. May be reserved for other types of accelerators&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Accelerator:Cores&lt;/td>
&lt;td>Number of cores of the accelerator&lt;/td>
&lt;td>Not so useful as there are several types of cores now (CUDA, tensor). May be reserved for other types of accelerators&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Adding metadata to flavours has no effects on site operations. End users can see
the metadata easily via &lt;code>openstack flavor list --long&lt;/code> or
&lt;code>openstack flavor show &amp;lt;flavor id&amp;gt;&lt;/code> commands without any additional tools, e.g.:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>$ fedcloud openstack flavor show gpu1cpu2 --site IISAS-GPUCloud --vo eosc-synergy.eu -f json
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Site: IISAS-GPUCloud, VO: eosc-synergy.eu
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ce5c00;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;OS-FLV-DISABLED:disabled&amp;#34;&lt;/span>: false,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;OS-FLV-EXT-DATA:ephemeral&amp;#34;&lt;/span>: 0,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;access_project_ids&amp;#34;&lt;/span>: null,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;disk&amp;#34;&lt;/span>: 40,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#4e9a06">&amp;#34;a8082202-f647-4d1f-9b97-4f5ddb38ae8e&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;name&amp;#34;&lt;/span>: &lt;span style="color:#4e9a06">&amp;#34;gpu1cpu2&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;os-flavor-access:is_public&amp;#34;&lt;/span>: false,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;properties&amp;#34;&lt;/span>: &lt;span style="color:#4e9a06">&amp;#34;Accelerator:Version=&amp;#39;0&amp;#39;, Accelerator:Memory=&amp;#39;5&amp;#39;, Accelerator:Model=&amp;#39;Tesla K20m&amp;#39;, Accelerator:Number=&amp;#39;1.0&amp;#39;, Accelerator:Type=&amp;#39;GPU&amp;#39;, Accelerator:Vendor=&amp;#39;NVIDIA&amp;#39;, Accelerator:VirtualizationType=&amp;#39;PCI passthrough&amp;#39;, pci_passthrough:alias=&amp;#39;GPU:1&amp;#39;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;ram&amp;#34;&lt;/span>: 8192,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;rxtx_factor&amp;#34;&lt;/span>: 1.0,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;swap&amp;#34;&lt;/span>: &lt;span style="color:#4e9a06">&amp;#34;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;vcpus&amp;#34;&lt;/span>: &lt;span style="color:#0000cf;font-weight:bold">2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ce5c00;font-weight:bold">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Providers: VO Configuration guide</title><link>/providers/cloud-compute/openstack/vo-config/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/providers/cloud-compute/openstack/vo-config/</guid><description>
&lt;p>In this page you can find a summary of the needed steps for supporting a new VO
in your OpenStack infrastructure.&lt;/p>
&lt;h2 id="local-project-creation">Local project creation&lt;/h2>
&lt;p>The usual method of supporting a VO is by creating a local project for it. You
should assign quotas to this project as agreed in the OLA defining the support
for the given VO.&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Create a group where users belonging to the VO will be mapped to:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">group_id&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#204a87;font-weight:bold">$(&lt;/span>openstack group create -f value -c id &amp;lt;new_group&amp;gt;&lt;span style="color:#204a87;font-weight:bold">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Add that group to the desired local project:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>$ openstack role add member --group &lt;span style="color:#000">$group_id&lt;/span> --project &amp;lt;your project&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Set the &lt;code>egi.VO&lt;/code> property to the name of the VO that you are supporting:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>$ openstack project &lt;span style="color:#204a87">set&lt;/span> --property egi.VO&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&amp;lt;name of the VO&amp;gt; &amp;lt;your project&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;h2 id="keystone-mapping">Keystone Mapping&lt;/h2>
&lt;p>Expand your &lt;code>mapping.json&lt;/code> with the VO membership to the created group
(substitute &lt;code>group_id&lt;/code> and &lt;code>entitlement&lt;/code> as appropriate). The expected mappings
for the VOs are listed in
&lt;a href="https://github.com/EGI-Federation/fedcloud-catchall-operations/blob/main/vo-mappings.yaml">&lt;code>vo-mappings.yaml&lt;/code> of fedcloud-catchall-operations repository&lt;/a>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">[&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a40000">&amp;lt;existing&lt;/span> &lt;span style="color:#a40000">mappings&amp;gt;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;local&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#000;font-weight:bold">[&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;user&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;name&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;{0}&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;email&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;{1}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">},&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;group&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;id&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;&amp;lt;group_id&amp;gt;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;remote&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#000;font-weight:bold">[&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;type&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;HTTP_OIDC_SUB&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">},&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;type&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;HTTP_OIDC_EMAIL&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">},&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;type&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;HTTP_OIDC_ISS&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;any_one_of&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#000;font-weight:bold">[&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;https://aai.egi.eu/auth/realms/egi&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">},&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;type&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;OIDC-eduperson_entitlement&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;regex&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#204a87;font-weight:bold">true&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;any_one_of&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#000;font-weight:bold">[&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#34;^&amp;lt;entitlement&amp;gt;$&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>And update the mapping in your Keystone IdP:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>$ openstack mapping &lt;span style="color:#204a87">set&lt;/span> --rules mapping.json egi-mapping
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>You can include as many mappings as needed in the json file. Users will be
members of all the matching groups.&lt;/p>
&lt;h2 id="accounting">Accounting&lt;/h2>
&lt;p>Add the project supporting the VO to cASO:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>In the &lt;code>projects&lt;/code> field of &lt;code>/etc/caso/caso.conf&lt;/code> :&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ini" data-lang="ini">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#c4a000">projects&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">vo_project1, vo_project2, &amp;lt;your_new_vo_project&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>and as a new mapping in &lt;code>/etc/caso/voms.json&lt;/code> :&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;&amp;lt;your new vo&amp;gt;&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;projects&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#000;font-weight:bold">[&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&amp;lt;your new vo project&amp;gt;&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;p>Be sure to include the user running cASO at least as &lt;code>reader&lt;/code> of the project if
it does not have admin privileges:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>openstack role add --user &amp;lt;your caso user&amp;gt; --project &amp;lt;your new vo project&amp;gt; reader
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="information-system--vm-image-management">Information system / VM Image management&lt;/h2>
&lt;p>If you are correctly setting the &lt;code>egi.VO&lt;/code> property to your projects, the
configuration will be automatically retrieved by the catch-all components.&lt;/p></description></item><item><title>Providers: Useful Resources</title><link>/providers/cloud-compute/openstack/useful-resources/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/providers/cloud-compute/openstack/useful-resources/</guid><description>
&lt;p>In this page we gather a list of useful resources for OpenStack administrators.&lt;/p>
&lt;h2 id="openstack-idle-vm-detector-osidle">OpenStack IDLE VM Detector (osidle)&lt;/h2>
&lt;p>Our partners from &lt;a href="https://grycap.upv.es/">GRyCAP UPV&lt;/a> have created a tool
to analyze the usage of Virtual Machines running in OpenStack. For more
information please visit:
&lt;a href="https://github.com/grycap/osidle/">https://github.com/grycap/osidle/&lt;/a>.&lt;/p>
&lt;h2 id="share-yours">Share yours&lt;/h2>
&lt;p>Would you like to share your favourite tool to make OpenStack management easier?
Then &lt;a href="../../../../support/">contact us&lt;/a>!&lt;/p></description></item></channel></rss>