diff --git a/populateCerts.js b/populateCerts.js index 733c09d421..60918b3d1e 100644 --- a/populateCerts.js +++ b/populateCerts.js @@ -27,14 +27,13 @@ const sidebarItems = scopes.map((scope) => { scope.versions.forEach((version) => { version.isStable = version.stabilized_at !== undefined && version.stabilized_at <= today version.isObsolete = version.obsoleted_at !== undefined && version.obsoleted_at < today - version.isActive = version.isStable && !version.isObsolete + version.isEffective = version.isStable && !version.isObsolete version.isPreview = version.stabilized_at === undefined || today < version.stabilized_at - if (!version.isActive && !version.isPreview) { + if (!version.isEffective && !version.isPreview) { numOld += 1 if (numOld > MAX_OLD) return - console.log(numOld) } - version.state = version.isActive ? '📜' : version.isPreview ? '✏️' : '🗑️' + version.state = version.isEffective ? 'effective' : version.isPreview ? 'preview' : 'obsolete' if (version.standards === undefined) return versionsShown[version.version] = version version.standards.forEach((standard) => { @@ -100,10 +99,10 @@ const sidebarItems = scopes.map((scope) => { 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].isActive).length ? '📜' : '✏️' + const state = columns.filter((c) => versionsShown[c].isEffective).length ? '📜' : '✏️' return { type: 'doc', - label: `${state} ${scope.name}`, + label: scope.name, id: scope.id, } }) diff --git a/populateStds.js b/populateStds.js index c75020db5b..436bc2ec02 100644 --- a/populateStds.js +++ b/populateStds.js @@ -37,7 +37,7 @@ filenames.forEach((filename) => { } obj.isStable = obj.stabilized_at !== undefined && obj.stabilized_at <= today obj.isObsolete = obj.obsoleted_at !== undefined && obj.obsoleted_at <= today - obj.isActive = obj.isStable && !obj.isObsolete + obj.isEffective = obj.isStable && !obj.isObsolete var track = obj.track if (track === undefined) return if (tracks[track] === undefined) tracks[track] = {} @@ -58,13 +58,18 @@ function readPrefixLines(fn) { return lines } +function mkLinkList(versions) { + var links = versions.map((v) => `[${v.version}](/standards/${v.id})`) + return links.join(', ') +} + // walk down the hierarchy, building adr overview pages, track overview pages, and total overview page // as well as the new sidebar sidebarItems = [] var lines = readPrefixLines('standards/standards/overview.md') if (!lines.length) lines.push(intro) -lines.push('| Standard | Track | Description | Active Versions |') -lines.push('| --------- | ------ | ------------ | ---------------- |') +lines.push('| Standard | Track | Description | Versions:
Preview |
Effective |
Obsolete |') +lines.push('| --------- | ------ | ------------ | --- | --- | --- |') Object.entries(tracks).forEach((trackEntry) => { var track = trackEntry[0] var trackPath = `standards/${track.toLowerCase()}` @@ -86,21 +91,22 @@ Object.entries(tracks).forEach((trackEntry) => { ${trackIntros[track]} `) } - tlines.push('| Standard | Description | Active Versions |') - tlines.push('| --------- | ------------ | ---------------- |') + tlines.push('| Standard | Description | Versions:
Preview |
Effective |
Obsolete |') + tlines.push('| --------- | ------------ | --- | --- | --- |') Object.entries(trackEntry[1]).forEach((standardEntry) => { var versions = standardEntry[1].versions - var activeVersions = versions.filter((v) => v.isActive) - var activeLinks = activeVersions.map((v) => `[${v.version}](/standards/${v.id})`) + // unfortunately, some standards are obsolete without being stable + var previewVersions = versions.filter((v) => !v.isStable && !v.isObsolete) + var effectiveVersions = versions.filter((v) => v.isEffective) + var obsoleteVersions = versions.filter((v) => v.isObsolete) var ref = versions[versions.length - 1] - if (activeVersions.length) { - activeVersions[activeVersions.length - 1] + if (effectiveVersions.length) { + ref = effectiveVersions[effectiveVersions.length - 1] } - var icon = activeVersions.length ? '📜' : '✏️' var adrId = standardEntry[0] var standardItem = { type: 'category', - label: `${icon} scs-${adrId}`, + label: `scs-${adrId}`, link: { type: 'doc', id: `${track.toLowerCase()}/scs-${adrId}`, @@ -117,18 +123,18 @@ ${trackIntros[track]} } slines.push('| Version | Type | State | stabilized | obsoleted |') slines.push('| -------- | ----- | ------- | ---------- | --------- |') - var link = `[${icon} scs-${adrId}](/standards/${track.toLowerCase()}/scs-${adrId})` - lines.push(`| ${link} | ${track} | ${ref.title} | ${activeLinks.join(', ')} |`) - tlines.push(`| ${link} | ${ref.title} | ${activeLinks.join(', ')} |`) + var link = `[scs-${adrId}](/standards/${track.toLowerCase()}/scs-${adrId})` + var versionList = `${mkLinkList(previewVersions) || '-'} | ${mkLinkList(effectiveVersions) || '-'} | ${mkLinkList(obsoleteVersions) || '-'}` + lines.push(`| ${link} | ${track} | ${ref.title} | ${versionList} |`) + tlines.push(`| ${link} | ${ref.title} | ${versionList} |`) standardEntry[1].versions.forEach((obj) => { - var icon = obj.isActive ? '📜' : '✏️' var versionItem = { type: 'doc', label: obj.version.toUpperCase(), id: obj.id, } standardItem.items.push(versionItem) - slines.push(`| [${icon} scs-${adrId}-${obj.version}](/standards/${obj.id}) | ${obj.type} | ${obj.status || obj.state} | ${obj.stabilized_at || '-'} | ${obj.obsoleted_at || '-'} |`) + slines.push(`| [scs-${adrId}-${obj.version}](/standards/${obj.id}) | ${obj.type} | ${obj.status || obj.state} | ${obj.stabilized_at || '-'} | ${obj.obsoleted_at || '-'} |`) }) slines.push('') // file should end with a single newline character fs.writeFileSync(`${trackPath}/scs-${adrId}.md`, slines.join('\n'), 'utf8') diff --git a/sidebarsStandards.js b/sidebarsStandards.js index 64c436d031..888695c46c 100644 --- a/sidebarsStandards.js +++ b/sidebarsStandards.js @@ -11,7 +11,17 @@ const sidebars = { type: 'doc', id: 'certification/overview', }, - items: require('./sidebarsCertificationItems.js'), + items: [ + { + type: 'category', + label: 'Scopes and Versions', + link: { + type: 'doc', + id: 'certification/scopes-versions', + }, + items: require('./sidebarsCertificationItems.js'), + }, + ] }, { type: 'category', diff --git a/standards/certification/scopes-versions.md b/standards/certification/scopes-versions.md new file mode 100644 index 0000000000..6aa33cf382 --- /dev/null +++ b/standards/certification/scopes-versions.md @@ -0,0 +1,18 @@ +# Scopes and versions + +SCS provides a certification framework consisting of six different kinds of certificates of varying scope. +These scopes can be sorted into two dimensions: + +1. _certification level_, of which there are three: + - SCS-compatible + - SCS-open + - SCS-sovereign +2. _cloud layer_, of which there are two: + - infastructure as a service (IaaS) + - Kubernetes as a service (KaaS) + +So, for instance, a certificate can have the scope _SCS-compatible IaaS_ or _SCS-sovereign KaaS_. + +Each scope corresponds to a set of standards. As these standards progress, so do the scopes, and we keep track of this by versioning. Each version undergoes a lifecycle of Draft, Stable, and Deprecated, and we aim to keep at most one version stable at the same time, with the exception of a transition period of 4 to 6 weeks. + +![Alt text](image.png)