diff --git a/README.md b/README.md index ffc6ecfcae..ed0a61347e 100644 --- a/README.md +++ b/README.md @@ -26,3 +26,8 @@ CD in your Terminal to the root directory of the cloned repository. Install all npm install npm start ``` + +## Linting problems + +The repository establishes commit hooks which check the files for correctness and style. +Have a look at the [linting-guide](https://docs.scs.community/community/contribute/linting-guide/) to get detailed information. diff --git a/community/contribute/linting-guide.md b/community/contribute/linting-guide.md index 41ad7838d5..07f427155d 100644 --- a/community/contribute/linting-guide.md +++ b/community/contribute/linting-guide.md @@ -21,6 +21,13 @@ The markdownlint rules are defined in the configuration file `.markdownlint-cli2 Additionally we use [markdownlint-rule-search-replace](https://github.com/OnkarRuikar/markdownlint-rule-search-replace) for fixing +## Local Usage for development + +```bash +npm run lint:md +npm run fix:md +``` + ## Github Workflows There are two actions running on every Pull Request on the `main` branch. diff --git a/docs/turnkey-solution/hardware-landscape.md b/docs/turnkey-solution/hardware-landscape.md new file mode 100644 index 0000000000..7e19133ecc --- /dev/null +++ b/docs/turnkey-solution/hardware-landscape.md @@ -0,0 +1,118 @@ +--- +sidebar_label: Hardware-Landscape +sidebar_position: 99 +--- + +# The SCS Hardware-Landscape + +![An image of the SCS hardware landscape rack](images/combined_rack_visual.jpg "The SCS hardware landscape rack"){width=500px} + +## General information + +The general aim of this environment is to install and operate the SCS reference implementation on hardware. +In addition to the classic tasks in the area of quality assurance, the environment is also used to evaluate +new concepts in the underlay(overlay network area, as a test environment for hardware-related developments, +as a demonstration environment for interested parties and as a publicly accessible blueprint for users. +The environment is designed for long-term use which a varying circle of users. + +The environment consists of 21 server and 12 switch components. The selection of hardware and the +functions and properties used was designed so that the focus is on generally available or characteristic +functions and dependency on manufacturer-specific functions is avoided. Instead of the x86 servers or SONiC +switches used here, the realised environment could also be realised with hardware from other manufacturers. + +From 1 January 2025, the environment will be operated by [forum SCS-Standards](https://scs.community/2024/10/23/osba-forum-scs-standards/) +and the participating companies. + +## Tasks and Objectives + +The tasks and objectives of the environments can be summarised as follows: + +* The division into several environments makes it possible to run a lab as well as to map a productive environment (near-live operation). +* Operation of the compliance monitor (automated test for conformity with the SCS standards) +* Implementation and validation of the developed standards in a reference environment +* Analysis of problems in the interaction with the standards +* Provision of proof-of-concept installations for interested parties who want to use, promote or further develop the project +* The environment can be used by members of the SCS Standards forum and by contributors to the SCS community + as a development and test environment for open-source development in connection with the further development + of the SCS standards, SCS reference implementation and other relevant software components ('open-lab'/'near-live laboratory'). +* Continuous Integration Environment ('Zuul as a Service') - Operation of non-critical zuul worker instances + +## Installation details + +The available hardware was divided into two distinct application areas: + +* The **lab environment** consists exclusively of switch hardware used to evaluate, test and develop + concepts in the area of 'Software Defined Networking'. This means that various switch models can be + used to test and implement development tasks in the area of the open [SONiC](https://sonicfoundation.dev/) NOS + (a network operating system based on Debian Linux) or provisioning automation tasks in the SONiC environment with the + open-source system Netbox, a solution that is used primarily for IPAM and DCIM (IP Address Management, Data Center Infrastructure Management). +* The **production environment** is an exemplary installation of the relevant or most reference implementations with regard to an + SCS system. It follows a configuration or approach that is based on the needs and circumstances of a real and much larger environment. + To this end, characteristic infrastructure components were automatically installed on the manager nodes used for the installation. + +The setup of the entire environment is designed in such a way that it can be reproducibly restored or reset. +Therefore, the Ansible automation available via OSISM was used in many areas. +Areas that could not be usefully automated using Ansible were implemented using a Python command-line tooling stored in the GIT repository. + +## Available documentation + +The primary point of information and orientation is the [*readme file*](https://github.com/SovereignCloudStack/hardware-landscape?tab=readme-ov-file#references) +which is stored at the top level of the [configuration repository](https://github.com/SovereignCloudStack/hardware-landscape). + +The relevant **References** section refers here to the individual documentation areas. + +## Specific installation and configuration details + +* Processes for access management to the environment (2 VPN gateways, SSH logins, SSH profiles,..) have been implemented +* The production and lab environments have been set up, automated and documented as described above +* The complete environment is managed in a [GIT repository](https://github.com/SovereignCloudStack/hardware-landscape), + adjustments and further developments are managed via GIT merge requests +* Almost all installation steps are [documented and automated](https://github.com/SovereignCloudStack/hardware-landscape/blob/main/documentation/System_Deployment.md) + based on a pure rack installation (The setup is extensively documented, in particular the few manual steps) + * The entire customized setup of the nodes is [implemented by OSISM/Ansible] + * All secrets (e.g. passwords) of the environment are stored and versioned in the encrypted Ansible Vault in i + the repository (when access is transferred, rekeying can be used to change the access or the rights to it). + * A far-reaching or in-depth automation has been created that allows the environment to be re-set up or parts of it to + be re-set up with a reasonable amount of personnel. + * The setup of the basic environment was implemented appropriately with Ansible and using the OSISM environment (the reference implementation) + * Python tooling was created that adds areas that are specific to the use case of the environment and provides functions that simplify the operation of the infrastructure + * Server systems + * Backup and restore of the hardware configuration + * Templating of the BMC configuration + * Automatic installation of the operating system base image via Redfish Virtual Media + * Control of the server status via command line (to stop and start the system for test, maintenance and energy-saving purposes) + * Generation of base profiles for the Ansible Inventory based on the hardware key data stored in the documentation + * Switches + * Backup and restore of the switch configuration + * Generation of base profiles for the Ansible Inventory based on the hardware key data stored in the documentation +* Network setup + * The two management hosts act as redundant VPN gateways, ssh jumphosts, routers and uplink routers + * The system is deployed with a layer 3 underlay concept + * An "eBGP router on the host" is implemented for the node-interconnectivity + (all nodes and all switches are running FRR instances) + * All Ceph and Openstack nodes of the system do not have a direct upstream routing + (access is configured and provided by HTTP-, NTP and DNS-proxies) + * For security reasons, the system itself can only be accessed via VPN. + The provider network of the production environment is realized with a VXLAN which is terminated on the managers for routing + ('a virtual provider network')). + * The basic node installation was realised in such a way that specific [node images](https://github.com/osism/node-image) + are created for the respective rack, which make the operation or reconfiguration of network equipment for PXE bootstrap + unnecessary. (Preliminary stage for rollout via OpenStack Ironic) + * The management of the hardware (BMC and switch management) is implemented with a VLAN + * Routing, firewalling and NAT is managed by a NFTables Script which adds rules in a idempotent way to the existing rules + of the manager nodes. +* The [openstack workload generator](https://github.com/SovereignCloudStack/openstack-workload-generator) is used put test workloads + on the system + * Automated creation of OpenStack domains, projects, servers, networks, users, etc. + * Launching test workloads + * Dismantling test workloads +* An observability stack was built + * Prometheus for metrics + * Opensearch for log aggregation + * Central syslog server for the switches on the managers (recorded via the manager nodes in Opensearch) +* Specific documentation created for the project + * Details of the hardware installed in the environment + * The physical structure of the environment was documented in detail (rack installation and cabling) + * The technical and logical structure of the environment was documented in detail + * A FAQ for handling the open-source network operating system SONiC was created with relevant topics for the test environment + * As part of the development, the documentation and implementation of the OSISM reference implementation was significantly improved (essentially resulting from diff --git a/docs/turnkey-solution/images/combined_rack_visual.jpg b/docs/turnkey-solution/images/combined_rack_visual.jpg new file mode 100644 index 0000000000..f3671f035d Binary files /dev/null and b/docs/turnkey-solution/images/combined_rack_visual.jpg differ diff --git a/package-lock.json b/package-lock.json index 1e341acd73..be9b59d1bd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,6 +27,7 @@ "lint-staged": "^13.1.2", "markdownlint-cli2": "^0.7.1", "markdownlint-rule-search-replace": "^1.0.9", + "node-fetch": "^2.7.0", "prettier": "^2.8.4", "prism-react-renderer": "^2.3.1", "react": "^18.2.0", @@ -6046,9 +6047,9 @@ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "engines": { "node": ">= 0.6" } @@ -8484,16 +8485,16 @@ } }, "node_modules/express": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", - "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", + "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -9936,9 +9937,9 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", + "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -12043,9 +12044,9 @@ } }, "node_modules/mermaid": { - "version": "10.9.0", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-10.9.0.tgz", - "integrity": "sha512-swZju0hFox/B/qoLKK0rOxxgh8Cf7rJSfAUc1u8fezVihYMvrJAS45GzAxTVf4Q+xn9uMgitBcmWk7nWGXOs/g==", + "version": "10.9.3", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-10.9.3.tgz", + "integrity": "sha512-V80X1isSEvAewIL3xhmz/rVmc27CVljcsbWxkxlWJWY/1kQa4XOABqpDl2qQLGKzpKm6WbTfUEKImBlUfFYArw==", "dependencies": { "@braintree/sanitize-url": "^6.0.1", "@types/d3-scale": "^4.0.3", @@ -12056,7 +12057,7 @@ "d3-sankey": "^0.12.3", "dagre-d3-es": "7.0.10", "dayjs": "^1.11.7", - "dompurify": "^3.0.5", + "dompurify": "^3.0.5 <3.1.7", "elkjs": "^0.9.0", "katex": "^0.16.9", "khroma": "^2.0.0", @@ -14381,6 +14382,26 @@ "node": ">=18" } }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -18113,6 +18134,12 @@ "node": ">=6" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, "node_modules/trim-lines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", @@ -18868,6 +18895,12 @@ "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.3.0.tgz", "integrity": "sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==" }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, "node_modules/webpack": { "version": "5.94.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", @@ -19170,6 +19203,16 @@ "node": ">=0.8.0" } }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index 150e54d24b..c6d657d6e6 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "write-translations": "docusaurus write-translations", "write-heading-ids": "docusaurus write-heading-ids", "typecheck": "tsc", - "postinstall": "node getDocs.js && node populateStds.js && node populateCerts.js", + "postinstall": "node getDocs.js && node populateStds.js && node populateCerts.js && node populateClouds.js", "test": "echo \"Error: no test specified\" && exit 1", "lint:md": "markdownlint-cli2 \"**/*.md\"", "fix:md": "markdownlint-cli2-fix \"**/*.md\"", @@ -54,6 +54,7 @@ "lint-staged": "^13.1.2", "markdownlint-cli2": "^0.7.1", "markdownlint-rule-search-replace": "^1.0.9", + "node-fetch": "^2.7.0", "prettier": "^2.8.4", "prism-react-renderer": "^2.3.1", "react": "^18.2.0", diff --git a/populateCerts.js b/populateCerts.js index db5497057f..73b32627fa 100644 --- a/populateCerts.js +++ b/populateCerts.js @@ -1,108 +1,46 @@ +const fetch = require('node-fetch') const fs = require('fs') const YAML = require('yaml') +async function fetchScopeTable(uuid, title, path) { + const response = await fetch( + `https://compliance.sovereignit.cloud/markdown/scope/${uuid}` + ) + var text = await response.text() + text = `# ${title}\n\n${text}` + fs.writeFileSync(path, text, 'utf8') +} + // how many outdated versions of any scope to include const MAX_OLD = 1 const filenames = fs - .readdirSync('standards/') - .filter((fn) => fn.startsWith('scs-') && fn.endsWith('.yaml')) + .readdirSync('standards/') + .filter((fn) => fn.startsWith('scs-') && fn.endsWith('.yaml')) const scopes = filenames.map((filename) => { - return { - ...YAML.parseDocument(fs.readFileSync(`standards/${filename}`, 'utf8')).toJSON(), - filename, - id: filename.substring(0, filename.length - 5), - } + return { + ...YAML.parseDocument( + fs.readFileSync(`standards/${filename}`, 'utf8') + ).toJSON(), + filename, + id: filename.substring(0, filename.length - 5) + } }) const today = new Date().toISOString().slice(0, 10) const sidebarItems = scopes.map((scope) => { - const matrix = {} - const versionsShown = {} - var numOld = 0 - var modules = {} - scope.modules.forEach((module) => { - modules[module.id] = module - module.prettyName = module.id.startsWith('scs-') ? `${module.id}: ${module.name}` : module.name - }) - scope.timeline.sort((a, b) => b.date.localeCompare(a.date)) - const current = scope.timeline.filter((entry) => entry.date <= today) - const lookup = current.length ? current[0].versions : {} - // sort in descending order, so we get the MAX_OLD most recent obsolete versions - scope.versions.sort((a, b) => b.version.localeCompare(a.version)); - scope.versions.forEach((version) => { - version.state = lookup[version.version] || 'deprecated' - version.isStable = version.stabilized_at !== undefined && version.stabilized_at <= today - version.isEffective = version.state == 'effective' - if (['warn', 'effective', 'draft'].indexOf(version.state) == -1) { - numOld += 1 - if (numOld > MAX_OLD) return - } - if (version.include === undefined) return - versionsShown[version.version] = version - version.include.forEach((include) => { - if (include.ref === undefined) { - include = {ref: include, parameters: {}} - } - const module = modules[include.ref] - if (matrix[module.id] === undefined) { - matrix[module.id] = { - name: module.prettyName, - columns: {}, - url: module.url, - } - } - matrix[module.id].columns[version.version] = { - parameters: include.parameters, - } - }) - }) - - const rows = Object.values(matrix) - const columns = Object.keys(versionsShown) - rows.sort((a, b) => a.name.localeCompare(b.name)); - columns.sort((a, b) => a.localeCompare(b)); - - lines = [`# ${scope.name} - -Note that the state _Stable_ is shown here if _stabilized at_ is in the future, whereas _Effective_ is shown here if _stabilized at_ is in the past and _deprecated at_ is unset or in the future. -`] - lines.push('| Scope versions -> | ' + columns.join(' | ') + ' |') - lines.push('| :-- | ' + columns.map(() => ':--').join(' | ') + ' |') - lines.push('| State | ' + columns.map((c) => versionsShown[c].state).join(' | ') + ' |') - lines.push('| Stabilized at | ' + columns.map((c) => versionsShown[c].stabilized_at || '').join(' | ') + ' |') - // lines.push('| Deprecated at | ' + columns.map((c) => versionsShown[c].deprecated_at || '').join(' | ') + ' |') - // md doesn't allow intermediate header rows - // lines.push('| :-- | ' + columns.map(() => ':--').join(' | ') + ' |') - lines.push('| **Modules** | ' + columns.map((c) => ' '.repeat(c.length)).join(' | ') + ' |') - // md doesn't allow intermediate header rows - // lines.push('| :-- | ' + columns.map(() => ':--').join(' | ') + ' |') - rows.forEach((row) => { - lines.push(`| [${row.name}](${row.url}) | ` + columns.map((c) => row.columns[c]).map((col) => { - if (col === undefined) { - // this version of the cert does not include this standard - return '' - } - let params = Object.entries(col.parameters || {}).map((entry) => - entry[1].startsWith('https://') ? `[${entry[0]}](${entry[1]})` : `${entry[0]}=${entry[1]}` - ).join(', ') - if (params.length) { - params = ` (${params})` - } - return `X${params}` - }).join(' | ') + ' |') - }) - lines.push('') // file should end with a single newline character - fs.writeFileSync(`standards/${scope.id}.md`, lines.join('\n'), 'utf8') - - const state = columns.filter((c) => versionsShown[c].isEffective).length ? '📜' : '✏️' - return { - type: 'doc', - label: scope.name, - id: scope.id, + fetchScopeTable(scope.uuid, scope.name, `standards/${scope.id}.md`).catch( + (e) => { + console.log(e) } + ) + return { + type: 'doc', + label: scope.name, + id: scope.id + } }) var newSidebars = `module.exports = ${JSON.stringify(sidebarItems, null, ' ')}` diff --git a/populateClouds.js b/populateClouds.js new file mode 100644 index 0000000000..7fc1128332 --- /dev/null +++ b/populateClouds.js @@ -0,0 +1,18 @@ +const fetch = require('node-fetch') +const fs = require('fs') + +async function insertCloudTable(pathIn, pathOut) { + const template = fs.readFileSync(pathIn, 'utf8') + const response = await fetch( + `https://compliance.sovereignit.cloud/markdown/table` + ) + const text = template.replace('', await response.text()) + fs.writeFileSync(pathOut, text, 'utf8') +} + +insertCloudTable( + `standards/certification/overview.template.md`, + `standards/certification/overview.md` +).catch((e) => { + console.log(e) +}) diff --git a/sidebarsDocs.js b/sidebarsDocs.js index 766062f989..375c30e04e 100644 --- a/sidebarsDocs.js +++ b/sidebarsDocs.js @@ -458,7 +458,10 @@ const sidebarsDocs = { link: { type: 'generated-index' }, - items: ['turnkey-solution/overview'] + items: [ + 'turnkey-solution/overview', + 'turnkey-solution/hardware-landscape' + ] }, { type: 'category', diff --git a/sidebarsUserDocs.js b/sidebarsUserDocs.js index 2b6c44c679..ccd5c759f9 100644 --- a/sidebarsUserDocs.js +++ b/sidebarsUserDocs.js @@ -7,6 +7,9 @@ const sidebars = { { type: 'category', label: 'Application Examples', + link: { + type: 'generated-index' + }, items: [ { type: 'category', diff --git a/standards/certification/overview.md b/standards/certification/overview.md deleted file mode 100644 index a5eb331072..0000000000 --- a/standards/certification/overview.md +++ /dev/null @@ -1,24 +0,0 @@ - -# Certification - -SCS certificates come with various scopes. See [Scopes and Versions](scopes-versions.md) for details. - -## Becoming certified - -In order for a cloud service offering to obtain a certificate, it has to conform to all standards of the respective scope, which will be tested at regular intervals, and the results of these tests will be made available publicly. For more details on how to become certified, please consult the corresponding [document](/standards/scs-0004-v1-achieving-certification). - -## Compliant cloud environments - -This is a list of clouds that we test on a nightly basis against the certificate scope _SCS-compatible IaaS_. - -| Name | Description | Operator | _SCS-compatible IaaS_ Compliance | HealthMon | -| -------------------------------------------------------------------------------------------------------------- | ------------------------------------------------- | ----------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------: | -| [gx-scs](https://github.com/SovereignCloudStack/docs/blob/main/community/cloud-resources/plusserver-gx-scs.md) | Dev environment provided for SCS & GAIA-X context | plusserver GmbH | [![Compliance Status](https://img.shields.io/github/actions/workflow/status/SovereignCloudStack/standards/check-gx-scs-v4.yml?label=v4)](https://github.com/SovereignCloudStack/standards/actions/workflows/check-gx-scs-v4.yml) | [HM](https://health.gx-scs.sovereignit.cloud:3000/) | -| [pluscloud open](https://www.plusserver.com/en/products/pluscloud-open)
- prod1
- prod2
- prod3
- prod4 | Public cloud for customers (4 regions) | plusserver GmbH |  
- prod1 [![Compliance Status](https://img.shields.io/github/actions/workflow/status/SovereignCloudStack/standards/check-pco-prod1-v4.yml?label=v4)](https://github.com/SovereignCloudStack/standards/actions/workflows/check-pco-prod1-v4.yml)
- prod2 [![Compliance Status](https://img.shields.io/github/actions/workflow/status/SovereignCloudStack/standards/check-pco-prod2-v4.yml?label=v4)](https://github.com/SovereignCloudStack/standards/actions/workflows/check-pco-prod2-v4.yml)
- prod3 [![Compliance Status](https://img.shields.io/github/actions/workflow/status/SovereignCloudStack/standards/check-pco-prod3-v4.yml?label=v4)](https://github.com/SovereignCloudStack/standards/actions/workflows/check-pco-prod3-v4.yml)
- prod4 [![Compliance Status](https://img.shields.io/github/actions/workflow/status/SovereignCloudStack/standards/check-pco-prod4-v4.yml?label=v4)](https://github.com/SovereignCloudStack/standards/actions/workflows/check-pco-prod4-v4.yml) |  
[HM1](https://health.prod1.plusserver.sovereignit.cloud:3000/d/9ltTEmlnk/openstack-health-monitor2?orgId=1&var-mycloud=plus-pco)
[HM2](https://health.prod1.plusserver.sovereignit.cloud:3000/d/9ltTEmlnk/openstack-health-monitor2?orgId=1&var-mycloud=plus-prod2)
[HM3](https://health.prod1.plusserver.sovereignit.cloud:3000/d/9ltTEmlnk/openstack-health-monitor2?orgId=1&var-mycloud=plus-prod3)
[HM4](https://health.prod1.plusserver.sovereignit.cloud:3000/d/9ltTEmlnk/openstack-health-monitor2?orgId=1&var-mycloud=plus-prod4) | -| [Wavestack](https://www.noris.de/wavestack-cloud/) | Public cloud for customers | noris network AG/Wavecon GmbH | [![Compliance Status](https://img.shields.io/github/actions/workflow/status/SovereignCloudStack/standards/check-wavestack-v4.yml?label=v4)](https://github.com/SovereignCloudStack/standards/actions/workflows/check-wavestack-v4.yml) | [HM](https://health.wavestack1.sovereignit.cloud:3000/) | -| [REGIO.cloud](https://regio.digital) | Public cloud for customers | OSISM GmbH | [![Compliance Status](https://img.shields.io/github/actions/workflow/status/SovereignCloudStack/standards/check-regio-a-v4.yml?label=v4)](https://github.com/SovereignCloudStack/standards/actions/workflows/check-regio-a-v4.yml) | broken | -| [CNDS](https://cnds.io/) | Public cloud for customers | artcodix GmbH | [![Compliance Status](https://img.shields.io/github/actions/workflow/status/SovereignCloudStack/standards/check-artcodix-v4.yml?label=v4)](https://github.com/SovereignCloudStack/standards/actions/workflows/check-artcodix-v4.yml) | [HM](https://ohm.muc.cloud.cnds.io/) | -| [aov.cloud](https://www.aov.de/) | Community cloud for customers | aov IT.Services GmbH | (soon) | [HM](https://health.aov.cloud/) | -| PoC WG-Cloud OSBA | Cloud PoC for FITKO (yaook-based) | Cloud&Heat Technologies GmbH | [![Compliance Status](https://img.shields.io/github/actions/workflow/status/SovereignCloudStack/standards/check-poc-wgcloud-v4.yml?label=v4)](https://github.com/SovereignCloudStack/standards/actions/workflows/check-poc-wgcloud-v4.yml) | [HM](https://health.poc-wgcloud.osba.sovereignit.cloud:3000/d/9ltTEmlnk/openstack-health-monitor2?var-mycloud=poc-wgcloud&orgId=1) | -| PoC KDO | Cloud PoC for FITKO | KDO Service GmbH / OSISM GmbH | [![Compliance Status](https://img.shields.io/github/actions/workflow/status/SovereignCloudStack/standards/check-poc-kdo-v4.yml?label=v4)](https://github.com/SovereignCloudStack/standards/actions/workflows/check-poc-kdo-v4.yml) | (soon) | -| [syseleven](https://www.syseleven.de/en/products-services/openstack-cloud/)
- dus2
- ham1 | Public OpenStack Cloud (2 SCS regions) | SysEleven GmbH |  
- dus2 [![Compliance Status](https://img.shields.io/github/actions/workflow/status/SovereignCloudStack/standards/check-syseleven-dus2-v4.yml?label=v4)](https://github.com/SovereignCloudStack/standards/actions/workflows/check-syseleven-dus2-v4.yml)
- ham1 [![Compliance Status](https://img.shields.io/github/actions/workflow/status/SovereignCloudStack/standards/check-syseleven-ham1-v4.yml?label=v4)](https://github.com/SovereignCloudStack/standards/actions/workflows/check-syseleven-ham1-v4.yml) |  
(soon)
(soon) | diff --git a/standards/certification/overview.template.md b/standards/certification/overview.template.md new file mode 100644 index 0000000000..3a1f678c54 --- /dev/null +++ b/standards/certification/overview.template.md @@ -0,0 +1,14 @@ + +# Certification + +SCS certificates come with various scopes. See [Scopes and Versions](scopes-versions.md) for details. + +## Becoming certified + +In order for a cloud service offering to obtain a certificate, it has to conform to all standards of the respective scope, which will be tested at regular intervals, and the results of these tests will be made available publicly. For more details on how to become certified, please consult the corresponding [document](/standards/scs-0004-v1-achieving-certification). + +## Compliant cloud environments + +This is a list of clouds that we test on a nightly basis against the certificate scope _SCS-compatible IaaS_. + + diff --git a/static/data/additionalResourcesData.json b/static/data/additionalResourcesData.json index da4c7b85f9..0358ce2ff1 100644 --- a/static/data/additionalResourcesData.json +++ b/static/data/additionalResourcesData.json @@ -20,7 +20,13 @@ { "title": "Deployment Examples", "body": "Get to know different ways to deploy SCS with cloud resources or on bare metal.", - "url": "/docs/iaas/guides/deploy-guide/examples", + "url": "/docs/category/deployment-examples", + "buttonText": "Explore Cases" + }, + { + "title": "Application Examples", + "body": "Discover best practices to make the most of your cloud, from introductions to specific applications to advanced use cases.", + "url": "/user-docs/category/application-examples", "buttonText": "Explore Cases" } ]