diff --git a/env.template b/env.template new file mode 100644 index 000000000..7d1790a9b --- /dev/null +++ b/env.template @@ -0,0 +1,14 @@ +GATSBY_IDP_BASE_URL= +GATSBY_OAUTH2_CLIENT_ID= +GATSBY_API_BASE_URL= +GATSBY_SCOPES= +GATSBY_SPONSORED_PROJECT_ID= +GATSBY_BUILD_SCOPES= +GATSBY_OAUTH2_CLIENT_ID_BUILD= +GATSBY_OAUTH2_CLIENT_SECRET_BUILD= +GATSBY_OAUTH_TOKEN_PATH= +GATSBY_SF_OID= +GATSBY_FRIENDLY_CAPTCHA_SITE_KEY= +GATSBY_FRIENDLY_CAPTCHA_API_KEY= +GATSBY_ELECTION_SINCE_YEAR= +GATSBY_ELECTION_TO_SHOW= \ No newline at end of file diff --git a/gatsby-node.js b/gatsby-node.js index 01dde4864..b00afa40e 100644 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -6,6 +6,14 @@ const axios = require('axios') const {createFilePath} = require('gatsby-source-filesystem') const {fmImagesToRelative} = require('gatsby-remark-relative-images') const {ClientCredentials} = require('simple-oauth2'); +const yaml = require("yaml") +const moment = require("moment-timezone"); +const prevElectionsBasePath = 'src/pages/election/previous-elections'; +const currentYear = new Date().getFullYear(); +const electionsSinceYear = process.env.GATSBY_ELECTION_SINCE_YEAR || 2023; +const minimunElectionsToShow = process.env.GATSBY_ELECTION_TO_SHOW || 2; + +const electionsToShow = (currentYear - electionsSinceYear) + minimunElectionsToShow; const myEnv = require("dotenv").config({ path: `.env`, @@ -107,6 +115,69 @@ const SSR_getSponsoredProjects = async (baseUrl) => { .catch(e => console.log('ERROR: ', e)); } +const SSR_getPreviousElections = async (baseUrl, accessToken, page = 1) => { + const currentDate = parseInt(Date.now()/1000); + // minimun per page is 5 + const perPage = electionsToShow > 5 ? electionsToShow : 5; + return await axios.get( + `${baseUrl}/api/v1/elections/`, + { + params: { + access_token: accessToken, + page: page, + per_page: perPage, + filter: `closes<${currentDate}`, + order: '-closes' + } + }).then((response) => response.data) + .catch(e => console.log('ERROR: ', e)); +}; + +const SSR_getCurrentElection = async (baseUrl, accessToken, page = 1, perPage = 5) => { + return await axios.get( + `${baseUrl}/api/v1/elections/`, + { + params: { + access_token: accessToken, + page: page, + per_page: perPage, + order: '-closes' + } + }).then((response) => response.data) + .catch(e => console.log('ERROR: ', e)); +}; + +const SSR_getPreviousElectionCandidates = async (baseUrl, accessToken, electionId, page = 1) => { + return await axios.get( + `${baseUrl}/api/v1/elections/${electionId}/candidates/`, + { + params: { + access_token: accessToken, + per_page: 100, + page: page, + order: '+first_name,+last_name', + expand: 'member, member.election_applications, member.election_applications.nominator', + fields: 'member.election_applications.nominator.first_name, member.election_applications.nominator.last_name' + } + }).then((response) => response.data) + .catch(e => console.log('ERROR: ', e)); +}; + +const SSR_getPreviousElectionGoldCandidates = async (baseUrl, accessToken, electionId, page = 1) => { + return await axios.get( + `${baseUrl}/api/v1/elections/${electionId}/candidates/gold`, + { + params: { + access_token: accessToken, + per_page: 100, + page: page, + order: '+first_name,+last_name', + expand: 'member', + } + }).then((response) => response.data) + .catch(e => console.log('ERROR: ', e)); +}; + exports.onPreBootstrap = async () => { const apiBaseUrl = process.env.GATSBY_API_BASE_URL; const buildScopes = process.env.GATSBY_BUILD_SCOPES; @@ -172,6 +243,176 @@ exports.onPreBootstrap = async () => { } } +exports.sourceNodes = async ({ actions, createNodeId, createContentDigest }) => { + const { createNode } = actions; + + const apiBaseUrl = process.env.GATSBY_API_BASE_URL; + const buildScopes = process.env.GATSBY_BUILD_SCOPES; + + console.log(`onSourceNodes...`); + + const config = { + client: { + id: process.env.GATSBY_OAUTH2_CLIENT_ID_BUILD, + secret: process.env.GATSBY_OAUTH2_CLIENT_SECRET_BUILD + }, + auth: { + tokenHost: process.env.GATSBY_IDP_BASE_URL, + tokenPath: process.env.GATSBY_OAUTH_TOKEN_PATH + }, + options: { + authorizationMethod: 'header' + } + }; + + const accessToken = await getAccessToken(config, buildScopes).then(({token}) => token.access_token).catch(e => console.log('Access Token error', e)); + + // data for previous electionsfilePath + const previousElections = await SSR_getPreviousElections(apiBaseUrl, accessToken) + const lastElections = previousElections.data.slice(0, electionsToShow); + if (lastElections && lastElections.length > 0) { + let candidates = []; + let goldCandidates = []; + // create paths + fs.mkdirSync(prevElectionsBasePath, { recursive: true } ); + fs.mkdirSync(`${prevElectionsBasePath}/candidates`, { recursive: true } ); + fs.mkdirSync(`${prevElectionsBasePath}/candidates/gold`, { recursive: true } ); + + for (const election of lastElections) { + + function formatMarkdown(post) { + const { body } = post + delete post.body + return + } + + const seoObject = { + image: "/img/OpenInfra-icon-white.jpg", + twitterUsername: "@OpenInfraDev" + } + + const electionYear = moment(election.closes * 1000).utc().format('YYYY'); + // create MD file using yaml ... + if(!fs.existsSync(`${prevElectionsBasePath}/${election.id}.md`)) + fs.writeFileSync(`${prevElectionsBasePath}/${election.id}.md`, `---\n${yaml.stringify({ + templateKey: 'election-page-previous', + electionYear:electionYear, + electionId:election.id, + title:election.name, + seo: { + ...seoObject, + title: election.name, + url: `https://openinfra.dev/election/${electionYear}-individual-director-election`, + description: `Individual Member Director elections for the ${electionYear} Board of Directors` + } + })}---\n`, 'utf8', function (err) { + if (err) { + console.log(err); + } + }); + + // create MD file using yaml ... + if(!fs.existsSync(`${prevElectionsBasePath}/candidates/${election.id}_candidates.md`)) + fs.writeFileSync(`${prevElectionsBasePath}/candidates/${election.id}_candidates.md`, `---\n${yaml.stringify({ + templateKey: 'election-candidates-page-previous', + electionYear:electionYear, + electionId:election.id, + title:`${election.name} Candidates`, + seo: { + ...seoObject, + title: election.name, + url: `https://openinfra.dev/election/${electionYear}-individual-director-election/candidates`, + description: `Individual Member Director elections for the ${electionYear} Board of Directors` + }})}---\n`, 'utf8', function (err) { + if (err) { + console.log(err); + } + }); + + if(!fs.existsSync(`${prevElectionsBasePath}/candidates/gold/${election.id}_gold_candidates.md`)) + fs.writeFileSync(`${prevElectionsBasePath}/candidates/gold/${election.id}_gold_candidates.md`, `---\n${yaml.stringify({ + templateKey: 'election-gold-candidates-page-previous', + electionYear:electionYear, + electionId:election.id, + title:`${election.name} Gold Candidates`, + seo: { + ...seoObject, + title: election.name, + url: `https://openinfra.dev/election/${electionYear}-individual-director-election/candidates/gold`, + description: `Individual Member Director elections for the ${electionYear} Board of Directors` + }})}---\n`, 'utf8', function (err) { + if (err) { + console.log(err); + } + }); + + const electionCandidates = await SSR_getPreviousElectionCandidates(apiBaseUrl, accessToken, election.id); + const electionGoldCandidates = await SSR_getPreviousElectionGoldCandidates(apiBaseUrl, accessToken, election.id); + + if (Array.isArray(electionCandidates.data) && electionCandidates.data.length > 0) candidates = [...candidates, ...electionCandidates.data]; + if (Array.isArray(electionGoldCandidates.data) && electionGoldCandidates.data.length > 0) goldCandidates = [...goldCandidates, ...electionGoldCandidates.data]; + } + + // data for current election + const currentElection = await SSR_getCurrentElection(apiBaseUrl, accessToken).then((res) => res.data[0]); + + createNode({ + ...currentElection, + id: `${currentElection.id}`, + electionYear: moment(currentElection.closes * 1000).utc().format('YYYY'), + parent: null, + children: [], + internal: { + type: 'CurrentElectionData', // Replace with an appropriate type + contentDigest: createContentDigest(currentElection), + }, + }) + + // ingest api data on graphql ... + lastElections.forEach(election => { + createNode({ + ...election, + id: `${election.id}`, + parent: null, + children: [], + internal: { + type: 'ElectionData', // Replace with an appropriate type + contentDigest: createContentDigest(election), + }, + }); + }) + + candidates.forEach(candidate => { + createNode({ + ...candidate, + id: createNodeId(`CandidateData-${candidate.member.id}`), + election_id: `${candidate.election_id}`, + parent: null, + children: [], + internal: { + type: 'CandidateData', // Replace with an appropriate type + contentDigest: createContentDigest(candidate), + }, + }); + }) + + goldCandidates.forEach(candidate => { + createNode({ + ...candidate, + id: createNodeId(`GoldCandidateData-${candidate.member.id}`), + election_id: `${candidate.election_id}`, + parent: null, + children: [], + internal: { + type: 'GoldCandidateData', // Replace with an appropriate type + contentDigest: createContentDigest(candidate), + }, + }); + }) + } + +}; + // explicit Frontmatter declaration to make category, author and date, optionals. exports.createSchemaCustomization = ({actions}) => { const {createTypes} = actions @@ -239,16 +480,158 @@ exports.createSchemaCustomization = ({actions}) => { col1: String col2: Date @dateformat } + type ElectionData implements Node { + opens: Int + closes: Int + nominationOpens: Int + nominationCloses: Int + nominationApplicationDeadline: Int + } ` createTypes(typeDefs) } exports.createPages = ({actions, graphql}) => { - const {createPage} = actions + const { createPage, createRedirect} = actions; + + const getElectionPath = (templateKey, electionYear) => { + const electionTemplates = ['election-page-previous', 'election-page']; + const candidatesTemplates = ['election-candidates-page-previous', 'election-candidates-page']; + const goldCandidatesTemplates = ['election-gold-candidates-page-previous', 'election-gold-candidates-page']; + if(electionTemplates.includes(templateKey)) return `/election/${electionYear}-individual-director-election`; + if(candidatesTemplates.includes(templateKey)) return `/election/${electionYear}-individual-director-election/candidates`; + if(goldCandidatesTemplates.includes(templateKey)) return `/election/${electionYear}-individual-director-election/candidates/gold`; + } - return graphql(` + const electionQuery = graphql(` { - allMarkdownRemark(limit: 1000) { + allMarkdownRemark( + limit: 1000 + filter: {frontmatter: {templateKey: {in: ["election-page", "election-candidates-page", "election-gold-candidates-page"]}}} + ) { + edges { + node { + id + fields { + slug + } + frontmatter { + title + templateKey + } + } + } + } + currentElectionData { + electionYear + } + } + `).then(result => { + + console.log(`createPage res ${JSON.stringify(result)}`); + + if (result.errors) { + result.errors.forEach(e => console.error(e.toString())) + return Promise.reject(result.errors) + } + + const electionsPages = result.data.allMarkdownRemark.edges; + const electionYear = result.data.currentElectionData.electionYear; + + electionsPages.forEach(edge => { + const id = edge.node.id; + const electionPath = getElectionPath(edge.node.frontmatter.templateKey, electionYear); + + console.log(`createPage processing edge ${JSON.stringify(edge)} path ${electionPath}`); + + createPage({ + path: electionPath, + component: path.resolve( + `src/templates/${String(edge.node.frontmatter.templateKey)}.js` + ), + // additional data can be passed via context + context: { + id + }, + }) + }); + + createRedirect({ + fromPath: `/election/`, + toPath: `/election/${electionYear}-individual-director-election`, + }); + + createRedirect({ + fromPath: `/election/candidates`, + toPath: `/election/${electionYear}-individual-director-election/candidates`, + }); + + createRedirect({ + fromPath: `/election/candidates/gold`, + toPath: `/election/${electionYear}-individual-director-election/candidates/gold`, + }); + }); + + const previousElectionQuery = graphql(` + { + allMarkdownRemark( + limit: 1000 + filter: {frontmatter: {templateKey: {in: ["election-page-previous", "election-candidates-page-previous", "election-gold-candidates-page-previous"]}}} + ) { + edges { + node { + id + fields { + slug + } + frontmatter { + title + templateKey + electionId + electionYear + } + } + } + } + } + `).then(result => { + + console.log(`createPage res ${JSON.stringify(result)}`); + + if (result.errors) { + result.errors.forEach(e => console.error(e.toString())) + return Promise.reject(result.errors) + } + + const electionsPages = result.data.allMarkdownRemark.edges; + + electionsPages.forEach(edge => { + + const id = edge.node.id; + const electionId = edge.node.frontmatter.electionId.toString(); + const electionYear = edge.node.frontmatter.electionYear; + const electionPath = getElectionPath(edge.node.frontmatter.templateKey, electionYear); + + console.log(`createPage processing edge ${JSON.stringify(edge)} path ${electionPath}`); + createPage({ + path: electionPath, + component: path.resolve( + `src/templates/${String(edge.node.frontmatter.templateKey)}.js` + ), + // additional data can be passed via context + context: { + id, + electionId + }, + }) + + }) + + }); + + const allPagesQuery = graphql(` + { + allMarkdownRemark(limit: 1000, filter: {frontmatter: {electionId: {eq: null}, templateKey: {nin: ["election-page", "election-candidates-page", "election-gold-candidates-page"]}}}) { edges { node { id @@ -277,11 +660,11 @@ exports.createPages = ({actions, graphql}) => { return Promise.reject(result.errors) } - const pages = result.data.allMarkdownRemark.edges + const pages = result.data.allMarkdownRemark.edges; pages.forEach(edge => { if (edge.node.frontmatter.templateKey) { - const id = edge.node.id + const id = edge.node.id; const SEO = edge.node.frontmatter.seo ? edge.node.frontmatter.seo : null; const slug = SEO && SEO.url ? SEO.url.replace('https://osf.dev', '').replace('https://openinfra.dev', '') : edge.node.fields.slug; createPage({ @@ -292,7 +675,7 @@ exports.createPages = ({actions, graphql}) => { ), // additional data can be passed via context context: { - id, + id }, }) } @@ -340,6 +723,8 @@ exports.createPages = ({actions, graphql}) => { }) }) + + return Promise.all([electionQuery, previousElectionQuery, allPagesQuery]); } exports.onCreateNode = ({node, actions, getNode}) => { @@ -359,6 +744,7 @@ exports.onCreateNode = ({node, actions, getNode}) => { } } + exports.onCreateWebpackConfig = ({actions, plugins, loaders}) => { actions.setWebpackConfig({ resolve: { diff --git a/netlify.toml b/netlify.toml index 1c4cf0f4c..55f57dd60 100644 --- a/netlify.toml +++ b/netlify.toml @@ -9,7 +9,24 @@ [build.environment] NODE_VERSION = "14.20.1" YARN_VERSION = "1.22.4" - YARN_FLAGS = "--no-ignore-optional" + YARN_FLAGS = "--no-ignore-optional" +# Deploy Preview context: all deploys resulting from a pull/merge request will +# inherit these settings. +[context.deploy-preview.environment] + GATSBY_IDP_BASE_URL = "https://testopenstackid.openstack.org" + GATSBY_OAUTH2_CLIENT_ID = "h1wVTVm75TJSmVcKtVXtYeqc-NKqMH86.openstack.client" + GATSBY_API_BASE_URL = "https://testresource-server.openstack.org" + GATSBY_SCOPES = "openid profile email address https://testresource-server.openstack.org/members/write/me https://testresource-server.openstack.org/members/read/me https://testresource-server.openstack.org/organizations/read https://testresource-server.openstack.org/organizations/write elections/candidates/nominate elections/candidates/write/me https://testresource-server.openstack.org/me/read https://testresource-server.openstack.org/me/summits/events/schedule/add https://testresource-server.openstack.org/me/summits/events/schedule/delete https://testresource-server.openstack.org/me/summits/events/schedule/shareable/delete https://testresource-server.openstack.org/me/summits/events/schedule/shareable/add me/write https://testresource-server.openstack.org/speakers/write/me https://testresource-server.openstack.org/speakers/read/me" + GATSBY_SPONSORED_PROJECT_ID = "1" + GATSBY_BUILD_SCOPES = "https://testresource-server.openstack.org/summits/read elections/read" + GATSBY_OAUTH2_CLIENT_ID_BUILD = "_fJKILOprSj4MYY6~6rhoPJeRT7_5616.openstack.client" + GATSBY_OAUTH2_CLIENT_SECRET_BUILD = "PFssJ_QNT_YjW9Uuk_dLqK9kx9ke.ndH4zAY-FBc59PzotI.0J18jPYXZ1snTkr4" + GATSBY_OAUTH_TOKEN_PATH = "/oauth2/token" + GATSBY_SF_OID = "00DG0000000lhAF" + GATSBY_FRIENDLY_CAPTCHA_SITE_KEY = "FCMLO9OV7A0PENUN" + GATSBY_FRIENDLY_CAPTCHA_API_KEY = "A1DIAJU833CPQ4P1HU2CMI75PIOMC3LPG4BG12RN93R1PC3QH41FNNQ4MM" + GATSBY_ELECTION_SINCE_YEAR="2023" + GATSBY_ELECTION_TO_SHOW="2" [[headers]] for = "/*" [headers.values] @@ -85,19 +102,6 @@ from = "/profile" to = "/a/profile" status = 301 -[[redirects]] - from = "/election" - to = "/election/2023-individual-director-election" - status = 301 -[[redirects]] - from = "/election/candidates" - to = "/election/2023-individual-director-election/candidates" - status = 301 -[[redirects]] - from = "/election/candidates/gold" - to = "/election/2023-individual-director-election/candidates/gold" - status = 301 - force = true [[redirects]] from = "/summit/registration" to = "https://vancouver2023.openinfra.dev/" @@ -119,112 +123,112 @@ status = 301 force = true [[redirects]] - from="https://summit.openinfra.dev/*" - to="https://openinfra.dev/summit" - status=301 - force=true -[[redirects]] - from="http://summit.openinfra.dev/*" - to="https://openinfra.dev/summit" - status=301 - force=true -[[redirects]] - from="http://summit.openstack.cn/*" - to="https://openinfra.dev/summit" - status=301 - force=true -[[redirects]] - from="/ptg/rooms/austin" - to="https://zoom.us/j/96906327910?pwd=aE51d1FtM0R3dDY1Vk0xUTJKaEZtUT09" - status=301 - force=true -[[redirects]] - from="/ptg/rooms/bexar" - to="https://zoom.us/j/98905969859?pwd=a0NFajNCSFFSQm93TFIrdDE1ditpdz09" - status=301 - force=true -[[redirects]] - from="/ptg/rooms/cactus" - to="https://zoom.us/j/91349816875?pwd=MXhBa3gxY280QVVwZzkwQk9JY0xldz09" - status=301 - force=true -[[redirects]] - from="/ptg/rooms/diablo" - to="https://zoom.us/j/96494117185?pwd=NGhya0NpeWppMEc1OUNKdlFPbDNYdz09" - status=301 - force=true -[[redirects]] - from="/ptg/rooms/essex" - to="https://zoom.us/j/98071109978?pwd=NlA5dVQxaEVucHZ4NjlOUmp6U0VvQT09" - status=301 - force=true -[[redirects]] - from="/ptg/rooms/folsom" - to="https://zoom.us/j/92793625777?pwd=dWRMR3E0OWM1V2kxT1dBUGJtMlU0Zz09" - status=301 - force=true -[[redirects]] - from="/ptg/rooms/grizzly" - to="https://zoom.us/j/95205115859?pwd=RUpBanhpK0NCbUlsNFYxQVJHYTQwQT09" - status=301 - force=true -[[redirects]] - from="/ptg/rooms/havana" - to="https://zoom.us/j/97381453385?pwd=bmYwcXltOVdSYS9SUzg3Zm9GWHZhZz09" - status=301 - force=true -[[redirects]] - from="/ptg/rooms/icehouse" - to="https://zoom.us/j/94855376980?pwd=MzMzVDE3MGdVWXQwVS81eEREMjdVZz09" - status=301 - force=true -[[redirects]] - from="/ptg/rooms/juno" - to="https://zoom.us/j/91509365720?pwd=QVJINGlHK0QwNk1ISVNFbnJBOVRYdz09" - status=301 - force=true -[[redirects]] - from="/ptg/rooms/kilo" - to="https://zoom.us/j/97156435772?pwd=a0xnZ1pwcXBXZU9oTkxWQ3JPRi81UT09" - status=301 - force=true -[[redirects]] - from="/ptg/rooms/liberty" - to="https://zoom.us/j/94265628858?pwd=YXllU3VFQzhaVWVRdmI3V0xJUERZdz09" - status=301 - force=true -[[redirects]] - from="/ptg/rooms/mitaka" - to="https://zoom.us/j/96239912151?pwd=b2NLMTdQeThjdW0vMzZWV3RPRHVidz09" - status=301 - force=true -[[redirects]] - from="/ptg/rooms/newton" - to="https://zoom.us/j/96855299345?pwd=bG5KZHloRzA3bkhCQVJBNmZCQUltZz09" - status=301 - force=true -[[redirects]] - from="/ptg/rooms/ocata" - to="https://zoom.us/j/99841882395?pwd=RzBnSXQwWURIU3prbGhqSFdxVXg2Zz09" - status=301 - force=true -[[redirects]] - from="/legal/code-of-conduct/events" - to="https://openinfra.dev/legal/code-of-conduct" - status=301 - force=true -[[redirects]] - from="/careers/marketing-coordinator" - to="https://openinfra.dev/careers" - status=301 - force=true -[[redirects]] - from="/experience" - to="https://openinfrafoundation.formstack.com/forms/my_open_source_experience" - status=301 - force=true -[[redirects]] - from="/blog/openinfra-foundation-cyber-resilience-act." - to="https://openinfra.dev/blog/openinfra-foundation-cyber-resilience-act" - status=301 - force=true + from = "https://summit.openinfra.dev/*" + to = "https://openinfra.dev/summit" + status = 301 + force = true +[[redirects]] + from = "http://summit.openinfra.dev/*" + to = "https://openinfra.dev/summit" + status = 301 + force = true +[[redirects]] + from = "http://summit.openstack.cn/*" + to = "https://openinfra.dev/summit" + status = 301 + force = true +[[redirects]] + from = "/ptg/rooms/austin" + to = "https://zoom.us/j/96906327910?pwd=aE51d1FtM0R3dDY1Vk0xUTJKaEZtUT09" + status = 301 + force = true +[[redirects]] + from = "/ptg/rooms/bexar" + to = "https://zoom.us/j/98905969859?pwd=a0NFajNCSFFSQm93TFIrdDE1ditpdz09" + status = 301 + force = true +[[redirects]] + from = "/ptg/rooms/cactus" + to = "https://zoom.us/j/91349816875?pwd=MXhBa3gxY280QVVwZzkwQk9JY0xldz09" + status = 301 + force = true +[[redirects]] + from = "/ptg/rooms/diablo" + to = "https://zoom.us/j/96494117185?pwd=NGhya0NpeWppMEc1OUNKdlFPbDNYdz09" + status = 301 + force = true +[[redirects]] + from = "/ptg/rooms/essex" + to = "https://zoom.us/j/98071109978?pwd=NlA5dVQxaEVucHZ4NjlOUmp6U0VvQT09" + status = 301 + force = true +[[redirects]] + from = "/ptg/rooms/folsom" + to = "https://zoom.us/j/92793625777?pwd=dWRMR3E0OWM1V2kxT1dBUGJtMlU0Zz09" + status = 301 + force = true +[[redirects]] + from = "/ptg/rooms/grizzly" + to = "https://zoom.us/j/95205115859?pwd=RUpBanhpK0NCbUlsNFYxQVJHYTQwQT09" + status = 301 + force = true +[[redirects]] + from = "/ptg/rooms/havana" + to = "https://zoom.us/j/97381453385?pwd=bmYwcXltOVdSYS9SUzg3Zm9GWHZhZz09" + status = 301 + force = true +[[redirects]] + from = "/ptg/rooms/icehouse" + to = "https://zoom.us/j/94855376980?pwd=MzMzVDE3MGdVWXQwVS81eEREMjdVZz09" + status = 301 + force = true +[[redirects]] + from = "/ptg/rooms/juno" + to = "https://zoom.us/j/91509365720?pwd=QVJINGlHK0QwNk1ISVNFbnJBOVRYdz09" + status = 301 + force = true +[[redirects]] + from = "/ptg/rooms/kilo" + to = "https://zoom.us/j/97156435772?pwd=a0xnZ1pwcXBXZU9oTkxWQ3JPRi81UT09" + status = 301 + force = true +[[redirects]] + from = "/ptg/rooms/liberty" + to = "https://zoom.us/j/94265628858?pwd=YXllU3VFQzhaVWVRdmI3V0xJUERZdz09" + status = 301 + force = true +[[redirects]] + from = "/ptg/rooms/mitaka" + to = "https://zoom.us/j/96239912151?pwd=b2NLMTdQeThjdW0vMzZWV3RPRHVidz09" + status = 301 + force = true +[[redirects]] + from = "/ptg/rooms/newton" + to = "https://zoom.us/j/96855299345?pwd=bG5KZHloRzA3bkhCQVJBNmZCQUltZz09" + status = 301 + force = true +[[redirects]] + from = "/ptg/rooms/ocata" + to = "https://zoom.us/j/99841882395?pwd=RzBnSXQwWURIU3prbGhqSFdxVXg2Zz09" + status = 301 + force = true +[[redirects]] + from = "/legal/code-of-conduct/events" + to = "https://openinfra.dev/legal/code-of-conduct" + status = 301 + force = true +[[redirects]] + from = "/careers/marketing-coordinator" + to = "https://openinfra.dev/careers" + status = 301 + force = true +[[redirects]] + from = "/experience" + to = "https://openinfrafoundation.formstack.com/forms/my_open_source_experience" + status = 301 + force = true +[[redirects]] + from = "/blog/openinfra-foundation-cyber-resilience-act." + to = "https://openinfra.dev/blog/openinfra-foundation-cyber-resilience-act" + status = 301 + force = true \ No newline at end of file diff --git a/package.json b/package.json index 8db3043ae..5d437c1fc 100644 --- a/package.json +++ b/package.json @@ -98,7 +98,8 @@ "uuid": "^7.0.0", "validator": "^9.4.1", "video.js": "^7.8.2", - "xmlhttprequest": "^1.8.0" + "xmlhttprequest": "^1.8.0", + "yaml": "^2.3.3" }, "devDependencies": { "@babel/core": "^7.17.8", diff --git a/src/content/settings.json b/src/content/settings.json index 56d9b0100..333d4ed15 100644 --- a/src/content/settings.json +++ b/src/content/settings.json @@ -1 +1 @@ -{"lastBuild":1673877303227} \ No newline at end of file +{"lastBuild":1697727997236} \ No newline at end of file diff --git a/src/pages/election/2022-election/candidates/gold/index.md b/src/pages/election/2022-election/candidates/gold/index.md deleted file mode 100644 index 752ebf6a3..000000000 --- a/src/pages/election/2022-election/candidates/gold/index.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -templateKey: election-gold-candidates-page-previous -seo: - description: Individual Member Director elections for the 2022 Board of - Directors will be held *Monday January 10, 2022 to * *Friday January 18, - 2022*. Nominations occur between *November 15 and December 15, 2020*. - image: /img/OpenInfra-icon-white.jpg - title: 2022 Board Elections - Gold Candidates List - twitterUsername: "@OpenInfraDev" - url: https://openinfra.dev/election/2022-individual-director-election/candidates/gold -title: 2022 Board Elections - Gold Candidates List -menu: - - text: CODE OF CONDUCT - link: ../../../../legal/code-of-conduct - - text: REPORT A BUG - link: mailto:info@openinfra.dev -intro: - title: Gold Director Selector Candidates - description: - "The candidates on this list are the intended Gold Directors from the Gold Member companies who are - running for election as Gold Director Selectors." ---- diff --git a/src/pages/election/2022-election/candidates/index.md b/src/pages/election/2022-election/candidates/index.md deleted file mode 100644 index bc549d60b..000000000 --- a/src/pages/election/2022-election/candidates/index.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -templateKey: election-candidates-page-previous -seo: - description: Individual Member Director elections for the 2022 Board of - Directors will be held *Monday January 10, 2022 to * *Friday January 18, - 2022*. Nominations occur between *November 15 and December 15, 2020*. - image: /img/OpenInfra-icon-white.jpg - title: 2022 Board Elections - Candidates List - twitterUsername: "@OpenInfraDev" - url: https://openinfra.dev/election/2022-individual-director-election/candidates -title: 2022 Board Elections - Candidates List -menu: - - text: CODE OF CONDUCT - link: ../../../legal/code-of-conduct - - text: REPORT A BUG - link: mailto:info@openinfra.dev -howToVote: - title: HOW TO VOTE - description: - "If you are an eligible voter, you will receive an email with the subject - Open Infrastructure Foundation - {$ElectionName} from - secretary@openinfra.dev. This email includes your unique voting link. If you do - not receive an email, please contact - secretary@openinfra.dev." ---- diff --git a/src/pages/election/candidates/gold/index.md b/src/pages/election/candidates/gold/index.md index 14606e236..b1de306aa 100644 --- a/src/pages/election/candidates/gold/index.md +++ b/src/pages/election/candidates/gold/index.md @@ -1,32 +1,32 @@ --- templateKey: election-gold-candidates-page seo: - description: Individual Member Director elections for the 2023 Board of - Directors will be held *Monday January 9, 2022 to * *Monday January 16, - 2023*. Nominations occur between *November 14 and December 16, 2022*. + description: Individual Member Director elections for the 2024 Board of + Directors will be held *Monday January 8, 2024 to * *Monday January 12, + 2024*. Nominations occur between *November 13 and December 15, 2023*. image: /img/OpenInfra-icon-white.jpg - title: 2023 Board Elections - Gold Candidates List + title: 2024 Board Elections - Gold Candidates List twitterUsername: "@OpenInfraDev" - url: https://openinfra.dev/election/2023-individual-director-election/candidates/gold -title: 2023 Board Elections - Gold Candidates List + url: https://openinfra.dev/election/2024-individual-director-election/candidates/gold +title: 2024 Board Elections - Gold Candidates List +intro: + title: Gold Director Selector Candidates + description: The candidates on this list are the intended Gold Directors from + the Gold Member companies who are running for election as Gold Director + Selectors. menu: - text: ELECTION DETAILS - link: /election/2023-individual-director-election + link: /election/2024-individual-director-election - text: SEE THE CANDIDATES - link: /election/2023-individual-director-election/candidates + link: /election/2024-individual-director-election/candidates - text: NOMINATE A MEMBER link: /a/community/members - text: BE A CANDIDATE link: /profile - text: GOLD MEMBER ELECTION CANDIDATES - link: /election/2023-individual-director-election/candidates/gold + link: /election/2024-individual-director-election/candidates/gold - text: CODE OF CONDUCT link: ../../../../legal/code-of-conduct - text: REPORT A BUG link: mailto:info@openinfra.dev -intro: - title: Gold Director Selector Candidates - description: - "The candidates on this list are the intended Gold Directors from the Gold Member companies who are - running for election as Gold Director Selectors." --- diff --git a/src/pages/election/candidates/index.md b/src/pages/election/candidates/index.md index 8312b269b..0ffdfd81e 100644 --- a/src/pages/election/candidates/index.md +++ b/src/pages/election/candidates/index.md @@ -1,35 +1,34 @@ --- templateKey: election-candidates-page seo: - description: Individual Member Director elections for the 2023 Board of - Directors will be held *Monday January 9, 2022 to * *Monday January 16, - 2023*. Nominations occur between *November 14 and December 16, 2022*. + description: Individual Member Director elections for the 2024 Board of + Directors will be held *Monday January 8, 2024 to * *Friday January 12, + 2024*. Nominations occur between *November 13, 2023 and December 15, 2023*. image: /img/OpenInfra-icon-white.jpg - title: 2023 Board Elections - Candidates List + title: 2024 Board Elections - Candidates List twitterUsername: "@OpenInfraDev" - url: https://openinfra.dev/election/2023-individual-director-election/candidates -title: 2023 Board Elections - Candidates List + url: https://openinfra.dev/election/2024-individual-director-election/candidates +title: 2024 Board Elections - Candidates List menu: - text: ELECTION DETAILS - link: /election/2023-individual-director-election + link: /election/2024-individual-director-election - text: SEE THE CANDIDATES - link: /election/2023-individual-director-election/candidates + link: /election/2024-individual-director-election/candidates - text: NOMINATE A MEMBER link: /a/community/members - text: BE A CANDIDATE link: /profile - text: GOLD MEMBER ELECTION CANDIDATES - link: /election/2023-individual-director-election/candidates/gold + link: /election/2024-individual-director-election/candidates/gold - text: CODE OF CONDUCT link: ../../../legal/code-of-conduct - text: REPORT A BUG link: mailto:info@openinfra.dev howToVote: title: HOW TO VOTE - description: - "If you are an eligible voter, you will receive an email with the subject - OpenInfra Foundation 2023 Individual Director Election from - secretary@openinfra.dev. This email includes your unique voting link. If you do - not receive an email, please contact - secretary@openinfra.dev." + description: If you are an eligible voter, you will receive an email with the + subject OpenInfra Foundation 2024 Individual Director Election from + secretary@openinfra.dev. This email includes your unique voting link. If you + do not receive an email, please contact secretary@openinfra.dev. --- diff --git a/src/pages/election/index.md b/src/pages/election/index.md index 8dd01b44a..61b74938d 100644 --- a/src/pages/election/index.md +++ b/src/pages/election/index.md @@ -1,42 +1,41 @@ --- templateKey: election-page seo: - description: Individual Member Director elections for the 2023 Board of - Directors will be held *Monday January 9, 2023 to * *Friday January 13, - 2023*. Nominations occur between *November 14 and December 16, 2022*. + description: Individual Member Director elections for the 2024 Board of + Directors will be held *Monday January 8, 2024 to * *Friday January 12, + 2024*. Nominations occur between *November 13, 2023 and December 15, 2023*. image: /img/OpenInfra-icon-white.jpg - title: 2023 Board Elections + title: 2024 Board Elections twitterUsername: "@OpenInfraDev" - url: https://openinfra.dev/election/2023-individual-director-election -title: January 2023 Board Elections + url: https://openinfra.dev/election/2024-individual-director-election +title: January 2024 Board Elections subTitle: Individual and Gold Member elections menu: - text: ELECTION DETAILS - link: /election/2023-individual-director-election + link: /election/2024-individual-director-election - text: SEE THE CANDIDATES - link: /election/2023-individual-director-election/candidates + link: /election/2024-individual-director-election/candidates - text: NOMINATE A MEMBER link: /a/community/members - text: BE A CANDIDATE link: /profile - text: GOLD MEMBER ELECTION CANDIDATES - link: /election/2023-individual-director-election/candidates/gold + link: /election/2024-individual-director-election/candidates/gold - text: CODE OF CONDUCT link: ../../legal/code-of-conduct - text: REPORT A BUG link: mailto:info@openinfra.dev --- - #### About the Board -The Board of Directors is ultimately legally responsible for the Foundation as a corporate entity. Board activities include oversight of the Foundation and its budget, strategy and goals according to the mission and responsibilities. The 2023 Board will be composed of 21 directors elected by the Individual Members (7), directors elected by the Gold Members (7) and directors appointed by the Platinum Members (7). +The Board of Directors is ultimately legally responsible for the Foundation as a corporate entity. Board activities include oversight of the Foundation and its budget, strategy and goals according to the mission and responsibilities. The 2024 Board will be composed of 18 directors elected by the Individual Members (6), directors elected by the Gold Members (6) and directors appointed by the Platinum Members (6). As a true corporate board, Board members are responsible for fiduciary duties and adhering to an expanded code of conduct. All Directors need to attend regular quarterly Board meetings and any special meetings that come up. The meetings will be held in a way that allows for remote participation. #### Individual Member Director board seats -- Individual Member Directors are there to represent the Individual Members of the Foundation -- These Directors act as the link between the thousands of members of the Foundation and the Board, and are not representing the companies for which they work +* Individual Member Directors are there to represent the Individual Members of the Foundation +* These Directors act as the link between the thousands of members of the Foundation and the Board, and are not representing the companies for which they work When considering which candidates are best equipped to serve in this capacity, voters can review each candidate's application on the [candidate](/election/candidates) page prior to the start of the election. @@ -48,42 +47,42 @@ Members should review and comply with the the [Community Code of Conduct](/lega #### Election Overview: -Individual Member Director elections for the 2023 Board will be held **Monday January 9, 2023 to  Froday January 13, 2023**. You must have joined the Open Infrastructure Foundation as an Individual Member by Tuesday, July 17, 2022 to vote in the January 2023 election, per the bylaws. +Individual Member Director elections for the 2024 Board will be held **Monday January 8, 2024 to  Friday January 12, 2024**. You must have joined the Open Infrastructure Foundation as an Individual Member by Sunday, July 16, 2023 to vote in the January 2024 election, per the bylaws. -In accordance with the Open Infrastructure Foundation Bylaws, Board elections will take place online using a cumulative voting method. No more than three members of the Board may be affiliated with the same company, which means the candidate receiving the next highest votes would assume the seat if the election results in too many employees from a single company. Individual Member Directors elected in 2023 will serve a one-year term, but they may be nominated and re-elected indefinitely. The next election for Individual Member Directors will take place during January 2023. +In accordance with the Open Infrastructure Foundation Bylaws, Board elections will take place online using a cumulative voting method. No more than three members of the Board may be affiliated with the same company, which means the candidate receiving the next highest votes would assume the seat if the election results in too many employees from a single company. Individual Member Directors elected in 2024 will serve a one-year term, but they may be nominated and re-elected indefinitely. The next election for Individual Member Directors will take place during January 2024. -If you are an eligible voter, you will receive an email with a link to complete your ballot when the elections open on January 9, 2023. To ensure you receive the ballot, please log on to the website at [openinfra.dev/a/profile](/a/profile) and make sure your information is current. +If you are an eligible voter, you will receive an email with a link to complete your ballot when the elections open on January 8, 2024. To ensure you receive the ballot, please log on to the website at [openinfra.dev/a/profile](/a/profile) and make sure your information is current. #### Nomination Process -- Between November 14 and December 16, members can visit [this page](/a/community/members) and nominate candidates. -- Whenever a member is nominated, they will receive a notification (via the email listed in their member profile) -- Nominees must then log in and 1) accept the initial nomination, and 2) fill out the application -- Members who have received 10 nominations by December 16 must also complete the candidate application by December 21 in order to appear on the ballot +* Between November 13 and December 15, members can visit [this page](/a/community/members) and nominate candidates. +* Whenever a member is nominated, they will receive a notification (via the email listed in their member profile) +* Nominees must then log in and 1) accept the initial nomination, and 2) fill out the application +* Members who have received 10 nominations by December 15 must also complete the candidate application by December 20 in order to appear on the ballot #### Candidate Application -All candidates must complete the application by December 21 in order to appear on the ballot. Questions: +All candidates must complete the application by December 20 in order to appear on the ballot. Questions: -1. Bio -2. What is your relationship to OpenInfra, and why is its success important to you? What would you say is your biggest contribution to OpenInfra and/or OpenStack's success to date? -3. Describe your experience with other non profits or serving as a board member. How does your experience prepare you for the role of a board member? -4. What do you see as the Board's role in OpenInfra's success? -5. What do you think the top priority of the Board should be in 2023? +* Bio +* What is your relationship to OpenInfra, and why is its success important to you? What would you say is your biggest contribution to OpenInfra and/or OpenStack's success to date? +* Describe your experience with other non profits or serving as a board member. How does your experience prepare you for the role of a board member? +* What do you see as the Board's role in OpenInfra's success? +* What do you think the top priority of the Board should be in 2024? A candidate's responses will appear on their public profile, as well as on [the candidates page](/election/candidates). #### Election Timeline Summary: -- November 14: Individual Member nominations open, election details live on [openinfra.dev](/elections/current) -- December 16: Individual Member nominations close -- December 21: Deadline for Individual Member Nominees to complete application -- January 4: Gold Member Director Selector Election (1 day) -- January 9: Individual Member Elections open -- January 13: Individual Member Elections close +* November 13: Individual Member nominations open, election details live on [openinfra.dev](/elections/current) +* December 15: Individual Member nominations close +* December 20: Deadline for Individual Member Nominees to complete application +* January 4: Gold Member Director Selector Election (1 day) +* January 8: Individual Member Elections open +* January 12: Individual Member Elections close Note that the Gold Member process will complete prior to the start of the Individual Member elections. Each Platinum Member has already appointed a Board Member, although they can change that appointment at any time during their membership. #### Questions? -If you have any questions regarding membership, the nomination process, or any other matter regarding the elections, please contact the Secretary (Jonathan Bryce) at [secretary@openinfra.dev](mailto:secretary@openinfra.dev). Additionally, if you have an election problem to report, contact the election inspectors: [electioninspectors@openinfra.dev](mailto:electioninspectors@openinfra.dev) (led by Lisa Miller, one of the Foundation's corporate attorneys). +If you have any questions regarding membership, the nomination process, or any other matter regarding the elections, please contact the Secretary (Jonathan Bryce) at [secretary@openinfra.dev](mailto:secretary@openinfra.dev). Additionally, if you have an election problem to report, contact the election inspectors: [electioninspectors@openinfra.dev](mailto:electioninspectors@openinfra.dev) (led by Lisa Miller, one of the Foundation's corporate attorneys). \ No newline at end of file diff --git a/src/pages/election/2022-election/index.md b/src/pages/election/previous-elections/44599.md similarity index 72% rename from src/pages/election/2022-election/index.md rename to src/pages/election/previous-elections/44599.md index 9091dda86..ec206bb5c 100644 --- a/src/pages/election/2022-election/index.md +++ b/src/pages/election/previous-elections/44599.md @@ -1,24 +1,15 @@ --- templateKey: election-page-previous +electionYear: "2022" +electionId: 44599 +title: January 2022 Board Elections seo: - description: Individual Member Director elections for the 2022 Board of - Directors will be held *Monday January 10, 2022 to * *Friday January 18, - 2022*. Nominations occur between *November 15 and December 17, 2020*. image: /img/OpenInfra-icon-white.jpg - title: 2022 Board Elections twitterUsername: "@OpenInfraDev" + title: January 2022 Board Elections url: https://openinfra.dev/election/2022-individual-director-election -title: January 2022 Board Elections -subTitle: Individual and Gold Member elections -menu: - - text: CODE OF CONDUCT - link: ../../legal/code-of-conduct - - text: REPORT A BUG - link: mailto:info@openinfra.dev + description: Individual Member Director elections for the 2022 Board of Directors --- - -Individual Member Director elections for the January 2022 Board Elections will be held **Monday January 10, 2022 to Friday January 14, 2022**. Nominations occur between **November 15 and December 17, 2021**. - #### About the Board The Board of Directors is ultimately legally responsible for the Foundation as a corporate entity. Board activities include oversight of the Foundation and its budget, strategy and goals according to the mission and responsibilities. The 2022 Board will be composed of 27 directors elected by the Individual Members (9), directors elected by the Gold Members (9) and directors appointed by the Platinum Members (9). @@ -30,25 +21,25 @@ As a true corporate board, Board members are responsible for fiduciary duties an - Individual Member Directors are there to represent the Individual Members of the Foundation - These Directors act as the link between the thousands of members of the Foundation and the Board, and are not representing the companies for which they work -When considering which candidates are best equipped to serve in this capacity, voters can review each candidate's application on the [candidate](/election/candidates) page prior to the start of the election. +When considering which candidates are best equipped to serve in this capacity, voters can review each candidate's application on the [candidate](/election/candidates) page prior to the start of the election. -We ask that you give every candidate on the ballot careful consideration, and not base your vote **solely** on the fact that a particular candidate works for your employer. +We ask that you give every candidate on the ballot careful consideration, and not base your vote **solely** on the fact that a particular candidate works for your employer. #### Code of Conduct Reminder -Members should review and comply with the the [Community Code of Conduct](/legal/code-of-conduct), which states: "**Respect the election process**. Members should not attempt to manipulate election results. Open debate is welcome, but vote trading, ballot stuffing and other forms of abuse are not acceptable." +Members should review and comply with the the [Community Code of Conduct](/legal/code-of-conduct), which states: "**Respect the election process**. Members should not attempt to manipulate election results. Open debate is welcome, but vote trading, ballot stuffing and other forms of abuse are not acceptable." #### Election Overview: -Individual Member Director elections for the 2022 Board will be held **Monday January 10, 2022 to  Friday January 14, 2022**. You must have joined the Open Infrastructure Foundation as an Individual Member by Tuesday, July 18, 2021 to vote in the January 2022 election, per the bylaws. +Individual Member Director elections for the 2022 Board will be held **Monday January 10, 2022 to Friday January 14, 2022**. You must have joined the Open Infrastructure Foundation as an Individual Member by Tuesday, July 18, 2021 to vote in the January 2022 election, per the bylaws. -In accordance with the Open Infrastructure Foundation Bylaws, Board elections will take place online using a cumulative voting method. No more than three members of the Board may be affiliated with the same company, which means the candidate receiving the next highest votes would assume the seat if the election results in too many employees from a single company. Individual Member Directors elected in 2022 will serve a one-year term, but they may be nominated and re-elected indefinitely. The next election for Individual Member Directors will take place during January 2023. +In accordance with the Open Infrastructure Foundation Bylaws, Board elections will take place online using a cumulative voting method. No more than three members of the Board may be affiliated with the same company, which means the candidate receiving the next highest votes would assume the seat if the election results in too many employees from a single company. Individual Member Directors elected in 2022 will serve a one-year term, but they may be nominated and re-elected indefinitely. The next election for Individual Member Directors will take place during January 2023. If you are an eligible voter, you will receive an email with a link to complete your ballot when the elections open on January 10, 2022. To ensure you receive the ballot, please log on to the website at [openinfra.dev/a/profile](/a/profile) and make sure your information is current. #### Nomination Process -- Between November 15 and December 17, members can visit [this page](/a/community/members) and nominate candidates. +- Between November 15 and December 17, members can visit [this page](/a/community/members) and nominate candidates. - Whenever a member is nominated, they will receive a notification (via the email listed in their member profile) - Nominees must then log in and 1) accept the initial nomination, and 2) fill out the application - Members who have received 10 nominations by December 17 must also complete the candidate application by December 17 in order to appear on the ballot @@ -63,7 +54,7 @@ All candidates must complete the application by December 17 in order to appear o 4. What do you see as the Board's role in OpenInfra's success? 5. What do you think the top priority of the Board should be in 2022? -A candidate's responses will appear on their public profile, as well as on [the candidates page](/election/candidates). +A candidate's responses will appear on their public profile, as well as on [the candidates page](/election/candidates). #### Election Timeline Summary: diff --git a/src/pages/election/previous-elections/44601.md b/src/pages/election/previous-elections/44601.md new file mode 100644 index 000000000..8b7e5db83 --- /dev/null +++ b/src/pages/election/previous-elections/44601.md @@ -0,0 +1,72 @@ +--- +templateKey: election-page-previous +electionYear: "2023" +electionId: 44601 +title: January 2023 Board Elections +seo: + image: /img/OpenInfra-icon-white.jpg + twitterUsername: "@OpenInfraDev" + title: January 2023 Board Elections + url: https://openinfra.dev/election/2023-individual-director-election + description: Individual Member Director elections for the 2023 Board of Directors +--- +#### About the Board + +The Board of Directors is ultimately legally responsible for the Foundation as a corporate entity. Board activities include oversight of the Foundation and its budget, strategy and goals according to the mission and responsibilities. The 2023 Board will be composed of 21 directors elected by the Individual Members (7), directors elected by the Gold Members (7) and directors appointed by the Platinum Members (7). + +As a true corporate board, Board members are responsible for fiduciary duties and adhering to an expanded code of conduct. All Directors need to attend regular quarterly Board meetings and any special meetings that come up. The meetings will be held in a way that allows for remote participation. + +#### Individual Member Director board seats + +- Individual Member Directors are there to represent the Individual Members of the Foundation +- These Directors act as the link between the thousands of members of the Foundation and the Board, and are not representing the companies for which they work + +When considering which candidates are best equipped to serve in this capacity, voters can review each candidate's application on the [candidate](/election/candidates) page prior to the start of the election. + +We ask that you give every candidate on the ballot careful consideration, and not base your vote **solely** on the fact that a particular candidate works for your employer. + +#### Code of Conduct Reminder + +Members should review and comply with the the [Community Code of Conduct](/legal/code-of-conduct), which states: "**Respect the election process**. Members should not attempt to manipulate election results. Open debate is welcome, but vote trading, ballot stuffing and other forms of abuse are not acceptable." + +#### Election Overview: + +Individual Member Director elections for the 2023 Board will be held **Monday January 9, 2023 to  Froday January 13, 2023**. You must have joined the Open Infrastructure Foundation as an Individual Member by Tuesday, July 17, 2022 to vote in the January 2023 election, per the bylaws. + +In accordance with the Open Infrastructure Foundation Bylaws, Board elections will take place online using a cumulative voting method. No more than three members of the Board may be affiliated with the same company, which means the candidate receiving the next highest votes would assume the seat if the election results in too many employees from a single company. Individual Member Directors elected in 2023 will serve a one-year term, but they may be nominated and re-elected indefinitely. The next election for Individual Member Directors will take place during January 2023. + +If you are an eligible voter, you will receive an email with a link to complete your ballot when the elections open on January 9, 2023. To ensure you receive the ballot, please log on to the website at [openinfra.dev/a/profile](/a/profile) and make sure your information is current. + +#### Nomination Process + +- Between November 14 and December 16, members can visit [this page](/a/community/members) and nominate candidates. +- Whenever a member is nominated, they will receive a notification (via the email listed in their member profile) +- Nominees must then log in and 1) accept the initial nomination, and 2) fill out the application +- Members who have received 10 nominations by December 16 must also complete the candidate application by December 21 in order to appear on the ballot + +#### Candidate Application + +All candidates must complete the application by December 21 in order to appear on the ballot. Questions: + +1. Bio +2. What is your relationship to OpenInfra, and why is its success important to you? What would you say is your biggest contribution to OpenInfra and/or OpenStack's success to date? +3. Describe your experience with other non profits or serving as a board member. How does your experience prepare you for the role of a board member? +4. What do you see as the Board's role in OpenInfra's success? +5. What do you think the top priority of the Board should be in 2023? + +A candidate's responses will appear on their public profile, as well as on [the candidates page](/election/candidates). + +#### Election Timeline Summary: + +- November 14: Individual Member nominations open, election details live on [openinfra.dev](/elections/current) +- December 16: Individual Member nominations close +- December 21: Deadline for Individual Member Nominees to complete application +- January 4: Gold Member Director Selector Election (1 day) +- January 9: Individual Member Elections open +- January 13: Individual Member Elections close + +Note that the Gold Member process will complete prior to the start of the Individual Member elections. Each Platinum Member has already appointed a Board Member, although they can change that appointment at any time during their membership. + +#### Questions? + +If you have any questions regarding membership, the nomination process, or any other matter regarding the elections, please contact the Secretary (Jonathan Bryce) at [secretary@openinfra.dev](mailto:secretary@openinfra.dev). Additionally, if you have an election problem to report, contact the election inspectors: [electioninspectors@openinfra.dev](mailto:electioninspectors@openinfra.dev) (led by Lisa Miller, one of the Foundation's corporate attorneys). diff --git a/src/pages/election/previous-elections/candidates/44599_candidates.md b/src/pages/election/previous-elections/candidates/44599_candidates.md new file mode 100644 index 000000000..d9b7db79b --- /dev/null +++ b/src/pages/election/previous-elections/candidates/44599_candidates.md @@ -0,0 +1,12 @@ +--- +templateKey: election-candidates-page-previous +electionYear: "2022" +electionId: 44599 +title: January 2022 Board Elections Candidates +seo: + image: /img/OpenInfra-icon-white.jpg + twitterUsername: "@OpenInfraDev" + title: January 2022 Board Elections + url: https://openinfra.dev/election/2022-individual-director-election/candidates + description: Individual Member Director elections for the 2022 Board of Directors +--- diff --git a/src/pages/election/previous-elections/candidates/44601_candidates.md b/src/pages/election/previous-elections/candidates/44601_candidates.md new file mode 100644 index 000000000..645c8e694 --- /dev/null +++ b/src/pages/election/previous-elections/candidates/44601_candidates.md @@ -0,0 +1,12 @@ +--- +templateKey: election-candidates-page-previous +electionYear: "2023" +electionId: 44601 +title: January 2023 Board Elections Candidates +seo: + image: /img/OpenInfra-icon-white.jpg + twitterUsername: "@OpenInfraDev" + title: January 2023 Board Elections + url: https://openinfra.dev/election/2023-individual-director-election/candidates + description: Individual Member Director elections for the 2023 Board of Directors +--- diff --git a/src/pages/election/previous-elections/candidates/gold/44599_gold_candidates.md b/src/pages/election/previous-elections/candidates/gold/44599_gold_candidates.md new file mode 100644 index 000000000..93df6f6b2 --- /dev/null +++ b/src/pages/election/previous-elections/candidates/gold/44599_gold_candidates.md @@ -0,0 +1,12 @@ +--- +templateKey: election-gold-candidates-page-previous +electionYear: "2022" +electionId: 44599 +title: January 2022 Board Elections Gold Candidates +seo: + image: /img/OpenInfra-icon-white.jpg + twitterUsername: "@OpenInfraDev" + title: January 2022 Board Elections + url: https://openinfra.dev/election/2022-individual-director-election/candidates/gold + description: Individual Member Director elections for the 2022 Board of Directors +--- diff --git a/src/pages/election/previous-elections/candidates/gold/44601_gold_candidates.md b/src/pages/election/previous-elections/candidates/gold/44601_gold_candidates.md new file mode 100644 index 000000000..79ad5e86c --- /dev/null +++ b/src/pages/election/previous-elections/candidates/gold/44601_gold_candidates.md @@ -0,0 +1,12 @@ +--- +templateKey: election-gold-candidates-page-previous +electionYear: "2023" +electionId: 44601 +title: January 2023 Board Elections Gold Candidates +seo: + image: /img/OpenInfra-icon-white.jpg + twitterUsername: "@OpenInfraDev" + title: January 2023 Board Elections + url: https://openinfra.dev/election/2023-individual-director-election/candidates/gold + description: Individual Member Director elections for the 2023 Board of Directors +--- diff --git a/src/templates/election-candidates-page-previous.js b/src/templates/election-candidates-page-previous.js index f3bfa3af8..55f04ba5a 100644 --- a/src/templates/election-candidates-page-previous.js +++ b/src/templates/election-candidates-page-previous.js @@ -9,47 +9,28 @@ import Header from "../components/Header"; import SEO from "../components/SEO"; import LinkComponent from "../components/LinkComponent"; -import { getCandidates, getElectionStatus } from "../actions/election-actions"; +const ElectionCandidatesPagePreviousTemplate = ({ candidates, electionData }) => { -import { AjaxLoader } from "openstack-uicore-foundation/lib/components"; - -const ElectionCandidatesPagePreviousTemplate = ({ candidates, electionStatus, today, loading, menu, howToVote }) => { - - const acceptedCandidates = candidates.filter(c => c.member.election_applications.length >= 10); - const noBallotCandidates = candidates.filter(c => c.member.election_applications.length < 10 && c.member.election_applications.length > 0); + const {closes} = electionData; + const electionYear = moment(closes * 1000).utc().format('YYYY'); + return (
-
{
-
-
-
-

{howToVote.title}

- -
-
+

Candidates On The Ballot

@@ -58,234 +39,35 @@ const ElectionCandidatesPagePreviousTemplate = ({ candidates, electionStatus, to
-
- Allison Randal -

Allison Randal

-
Nominated by:Jonathan BryceTim BellMark CollierAllison PriceThierry CarrezAmy MarrichRamon SampangGhanshyam MannJean-Philippe EvrardJesse Pretorius
-
-
- About Allison Randal - -

Allison is a software developer and open source strategist. She is a board member and board chair (2021) of the Open Infrastructure Foundation, a board member of the Software Freedom Conservancy, a board member of Open Usage Commons, and co-founder of the FLOSS Foundations group for open source leaders. She previously served as president and board member of the Open Source Initiative, president and board member of the Perl Foundation, board member at the Python Software Foundation, chief architect of the Parrot virtual machine, chair of the board at the Parrot Foundation, Open Source Evangelist at O'Reilly Media, Conference Chair of OSCON, Technical Architect of Ubuntu, Open Source Advisor at Canonical, Distinguished Technologist and Open Source Strategist at Hewlett Packard Enterprise, and Distinguished Engineer at SUSE. She participates in the Debian and OpenStack projects, and is currently taking a mid-career research sabbatical to complete a PhD at the University of Cambridge.

-
-
- View Allison Randal's full candidate profile and Q&A >> -
-
-
- Amy Marrich -

Amy Marrich

-
Nominated by:Allison RandalEliad CohenBernard CafarelliDennis DeMarcoJean-Philippe EvrardDmitriy RabotyagovJesse PretoriusSean CohenEgle SiglerJulia Kreger
-
-
- About Amy Marrich - -

Amy Marrich is a Principal Technical Marketing Manager at Red Hat. She - previously worked at a small Open Source e-assessment company in - Luxembourg where she was the Open Source Community and Global Training - Manager.  Previously she was the OpenStack Instructor at Linux Academy - and a Linux System Engineer on the Platform Engineering Cloud Operations - team at Rackspace. She currently serves on the OpenStack Board, is an - active member of the Openstack Ansible project, chair of the OSF - Diversity and Inclusion Working Group, and previously the chair of the - OpenStack User Committee. Amy spends her free time competing in - performance events (agility, FASt Cat, and dock diving) with her - Dalmatians and competing in Dressage with her Connemara pony. -

-
-
- View Amy Marrich's full candidate profile and Q&A >> -
-
-
- Belmiro Moreira -

Belmiro Moreira

-
Nominated by:Graeme MossMarcos BenedictoJan van EldikErik Olof Gunnar AnderssonTadas SutkaitisDavid HollandBrendan ConlanTristan GoodeArne WiebalckTim Bell
-
-
- About Belmiro Moreira - -

Belmiro Moreira is an enthusiastic mathematician and computer engineer passionate about the challenges and complexities of architecting and deploying large scale open Cloud Infrastructures. 

-

Belmiro works at CERN and during the last 10 years he has been responsible for the design, deployment and maintenance of the CERN Cloud Infrastructure based on Openstack.

-

Previously he worked in different virtualization projects to improve the efficiency of the large Batch farm at CERN. 

-

Belmiro is from the beginning an active member of the OpenStack community. 

-

Currently, he is a member of the OpenStack TC (Technical Committee) and the co-chair of the OpenStack Large Scale SIG. Previously he was also a member of the OpenStack UC (User Committee). 

-

Belmiro is particularly interested in the challenges that cloud operators face when maintaining large scale open infrastructures. He talks regularly about his experience in several conferences and events, (OpenStack Summits, OpenStack User Groups, OpenInfra Live, CentOS Dojo, ...) and helps in the organization of many other events.

-

Belmiro is committed to continue to support the OpenInfra community.

-
-
- View Belmiro Moreira's full candidate profile and Q&A >> -
-
-
- Erik Olof Gunnar Andersson -

Erik Olof Gunnar Andersson

-
Nominated by:Julia KregerDuc TruongWes WilsonAmy MarrichMarcin KarpikJonathan BryceBelmiro MoreiraThierry CarrezTim BellAllison Randal
-
-
- About Erik Olof Gunnar Andersson - -

Erik (He/Him) works at Blizzard Entertainment as Lead Site Reliability Engineer for World of Warcraft. He started working for Blizzard back in 2009 and has since contributed to multiple iterations of the Blizzard infrastructure.
-
- Blizzard runs an on-prem OpenStack Cloud with over 12,000 nodes has been in production since the release of Overwatch in 2015. -

-

He has also been an active contributor to OpenStack since 2015, and is currently a Core Reviewer for Designate and Senlin.

-
-
- View Erik Olof Gunnar Andersson's full candidate profile and Q&A >> -
-
-
- Ghanshyam Mann -

Ghanshyam Mann

-
Nominated by:Prakash RamchandranIgnesius ThambyrajRuturaj KadikarTrinath SomanchiVaidyanath ManogaranDigambar PatilMark CollierAmy MarrichJean-Philippe EvrardAllison Price
-
-
- About Ghanshyam Mann - -

Ghanshyam is currently serving as a Chair of the OpenStack Technical Committee and Core developer in various OpenStack projects (Nova, QA and a few more) and served as PTL of the OpenStack QA. project. He started working in OpenStack with NEC in 2012 as a cloud support engineer, and since 2014 he has been involved in upstream development. His main upstream focus is on Nova, QA, API stability, and CI/CD. In addition, he is passionate about bringing more contributors to the Open Infra family and helping them in onboarding in the community via different programs like First Contact SIG, Upstream Institute Trainings, mentorship. Before OpenStack Upstream, he worked in different domains like Avionics, Storage, Cloud, and Virtualization. Ghanshyam started his career in technology as a software developer in the Avionic domain with the C++ language.

-

He has also been a frequent speaker in various Open Source events such as OpenStack, Open Infra, Open source summit, Open Infra Days and LinuxCon on various topics like RESTful API, QA, Cloud Backup, Open Source Community Building, Open Source Governance. In addition, he has been actively involved in various PoC and solutions designs around Cloud OSS and currently serving as Cloud Consultant in NEC.

-

More Details: https://ghanshyammann.com/

-
-
- View Ghanshyam Mann's full candidate profile and Q&A >> -
-
-
- Jean-Philippe Evrard -

Jean-Philippe Evrard

-
Nominated by:Dmitriy RabotyagovJesse PretoriusAndy McCraeChandan KumarHosam Al AliJoshua HeskethErik JohanssonRomain GuichardJaesuk AhnGhanshyam Mann
-
-
- About Jean-Philippe Evrard - -

I am a learner, problem solver, solutions bringer. I started to contribute in OpenStack in 2015. I was the PTL of OpenStack-Ansible during the Queens and Rocky cycle. I was member and chair of the OpenStack Technical Committee, and core reviewer on multiple projects. I was also an OpenStack release manager. I also worked on other projects of the OpenInfra foundation (outside OpenStack). 

-

I have my own company, and I focus on helping companies in their Open Source strategy.

-

I currently support City Network, as their CTO.

-

I am a lover of open source software, and am involved in other open source communities when I can (for example, Kubernetes).

-

If you missed me in OpenStack events or meetups, you can still meet me every year at the FOSDEM (when those happen in real life...), handling the openstack booth with fellow OpenStackers.

-
-
- View Jean-Philippe Evrard's full candidate profile and Q&A >> -
-
-
- Julia Kreger -

Julia Kreger

-
Nominated by:Allison RandalAmy MarrichEliad CohenBernard CafarelliAllison PriceMark CollierJean-Philippe EvrardJesse PretoriusSean CohenJonathan Bryce
-
-
- About Julia Kreger - -

Julia started her career in technology over twenty years ago. It has surely not been an average career, but a career where I've continually learned and evolved to fulfill the need. In a sense, it all started with Linux and answering some questions about installing Linux. This started a journey into computer networking and eventually shifted to a systems engineering focus with a stop-over in data center operations.

-

The DevOps movement lead Julia more into software development and the operationalization of software due to the need to automate large scale systems deployments. This required bringing an operational perspective while bridging to the requirements, and often required digging deep into the underlying code to solve the problem of the day.

-

In a sense, Julia found a home in OpenStack in 2014 and the Ironic project in 2015 because of many years spent working with physical hardware in data centers. 

-

Julia presently works for Red Hat as a Senior Principal Software Engineer, where her upstream focus has been Ironic for the past few years, and her downstream focus has been on helping lead adoption and use of Ironic. 

-

 

-
-
- View Julia Kreger's full candidate profile and Q&A >> -
-
-
- Kurt Garloff -

Kurt Garloff

-
Nominated by:Kurt GarloffClemens HardewigSebastian WennerJean-Philippe EvrardArtem GoncharovThierry CarrezJohn GarbuttMathias FechnerTim BellAmy Marrich
-
-
- About Kurt Garloff - -

I'm currently leading the European Cloud initiative Sovereign  Cloud Stack (SCS) as CTO - we have been able to get a grant from the  German government to fund the coordination and some of the development  work for this project. It's hosted by the Open Source Business Alliance  (OSBA), a non-profit that represents the open source industry in  Germany. The OSBA has joined the Open Infra Foundation as Associate  Member. SCS is closely linked to the European initiative Gaia-X. 

-

The idea behind SCS is to network the various Infra DevOps teams in  the industry that build Open Source cloud and container stacks for their  internal consumption or as public clouds. This avoids the duplication  of work and the slight incompatibility that all of these efforts would  have if not interlinked closely. SCS clouds are very compatible and can  be easily federated. SCS also puts a lot of focus on operational tooling  and processes, as high quality day 2 operations remains a challenge for  many operator.

-

Dec 2018 - Dec 2019, I was responsible for the Cloud and Storage  Departments in SUSE R&D. SUSE was a strong long-time supporter and  platinum member of the OIF, also hosting the HP Helion team after the  M&A transaction.

-

Before SUSE, I was leading the architecture, community and consulting teams in Deutsche Telekom's Open Telekom Cloud Team.
- DT has been a vocal supporter of OpenStack since I joined in early 2012.  -

-

I have personally supported the InterOp Workig Group. I was serving  in the board of the OIF in 2018 as Gold member director for DT and in  2020 and 2021 as individual director.

-

Before joining DT end of 2011 I was a long-time contributor to the  Linux kernel, which also gave me the privilege of building up and  leading SUSE Labs and work with a number of great engineers in- and  outside my company, contributing to the success of the Open Source technology.

-
-
- View Kurt Garloff's full candidate profile and Q&A >> -
-
-
- Mark Baker -

Mark Baker

-
Nominated by:Mark BakerBen RoederVictor EstivalHardik DalwadiHendricus KesselsTytus KurekEgle SiglerDave WalkerJonathan BryceMark Collier
-
-
About Mark BakerPreviously Product Manager in AWS EC2 and OpenStack PM at Canonical before that. Involved OpenStack since 2011, I helped design and release Canonical's OpenStack distribution from 2011 to 2018 and was an OpenStack Board Director for several years. A 25 year career in infrastructure software with Product Management, Product Marketings and Solutions architecture roles at Oracle, Red Hat, Canonical, MySQL and a couple of startups. Now recently joined Neo4j as lead PM for SaaS products running across a number of different clouds. I love spending time with Open Source infrastructure technology learning about the differing models, communities and the challenges of each. 
- View Mark Baker's full candidate profile and Q&A >> -
-
-
- Mohammed Naser -

Mohammed Naser

-
Nominated by:Julia KregerErik Olof Gunnar AnderssonHassan Jamil SyedMichiel PiscaerAbdenour YahiaouiChandan KumarSimon LeinenWes WilsonClemens HardewigJonathan BryceAbhisak Chulya
-
-
- About Mohammed Naser - -

Over the past 10 years, I’m happy to have watched the hosting industry transform and be part of the transformation process as it evolved from traditional physical hardware to cloud-native infrastructure, powered by OpenStack.  Since the creation of VEXXHOST, I have had the chance to work with different sorts of customers, ranging from growing small businesses to helping architect solutions for large Fortune 500 companies, based on OpenStack.  I've helped integrate other open infrastructure projects into our commercial offering.

-

By fostering OpenStack at it’s early days in 2011, it has helped improve the project and our service as a whole. I’ve been a contributor to the project since and I have contributed code to almost every release of OpenStack since then.  I've also served as PTL for Puppet OpenStack, continue to serve as a PTL for OpenStack-Ansible and serve on the technical commitee, chairing tthe commitee for a term.

-
-
- View Mohammed Naser's full candidate profile and Q&A >> -
-
-
- Rico Lin -

Rico Lin

-
Nominated by:Jonathan BryceAllison PriceWes WilsonMark CollierRico LinHorace LiGhanshyam MannJulia KregerAmy MarrichEric Guo
-
-
- About Rico Lin - -

Rico Lin, OpenStack Technical Committee (TC) member, Individual Board of Director for OpenInfra Foundation, Heat PTL, char for Multi-arch SIG, Senior Software Engineer at EasyStack.

-

Experienced in OpenStack development (infra and app), Cloud architect, Container(docker and k8s), community(contribute and event host), and customer tech consults and supports.

-

Goals in OpenStack:

-

* Improve experiences of Cloud-native application on top of OpenStack(by improving infra and user experiences).
- * Blending OpenStack with other cloud solutions to make it become one indispensable layer.
- * Leverage the community differences across global (Include let Asia community get more actively join to others). -

-
-
- View Rico Lin's full candidate profile and Q&A >> -
-
-
- Shane Wang -

Shane Wang

-
Nominated by:Jonathan BryceAllison PriceWes WilsonMark CollierHorace LiRuoyu YingRuijing GuoHuang HaibinJF DingRui Zang
-
-
- About Shane Wang - -

Shane Wang is an Engineering Director of Cloud Infrastructure Software at Software and Advanced Technology Group at Intel. He has participated in or led his team on research and development of open source software projects such as Xen, tboot, Yocto and OpenStack before. He has been serving as an Individual Director of OpenStack Foundation Board since 2015, with years of commitment to community development and building. Currently he and his team is focusing on cloud native, cloud workloads and benchmarking, software-defined networking (SDN) and software-defined storage (SDS) technologies, edge computing, including OpenStack, Ceph, Kubernetes, Istio/Envoy, containerd, SODA (also known as OpenSDS), ONAP, Akraino, StarlingX, Smart Edge Open (also known as OpenNESS), OpenDaylight, OPNFV, DPDK, and so forth.

-

He got his PhD degree on Computer Science from Fudan University at Shanghai in 2004, and joined Intel after graduating from the school.

-
-
- View Shane Wang's full candidate profile and Q&A >> -
-
-
- Vipin Rathi -

Vipin Rathi

-
Nominated by:Prakash RamchandranIgnesius ThambyrajRuturaj KadikarTrinath SomanchiSajid AkhtarVaidyanath ManogaranAnantha Padmanabhan CBDigambar PatilKavit MunshiGeetika Batra
-
-
- About Vipin Rathi - -

 Vipin Rathi is an Assistant Professor at the University of Delhi. He is Chairperson of Linux Foundation Hyperledger Telecom SIG. He has board level experience as VP at Emerging Open Tech Foundation. He is the organizer of Openstack India, Magma India, CNCF Delhi, Open Edge Computing, Open Source Networking, Hyperledger Meetups. His research interest focus on 5G, Multi-Domain Orchestration. He is guiding a Research team to develop a Kubernetes-based Cloud-Native OpenStack named as KupenStack. He is an active member of Anuket, Magma Core. He attended and delivered presentations at various Open Source summits.

-
-
- View Vipin Rathi's full candidate profile and Q&A >> -
-
+ {candidates.map((candidate, index) => { + return ( + <> +
+ {candidate.member.pic && {`${candidate.member.first_name}} +

{`${candidate.member.first_name} ${candidate.member.last_name}`}

+
+ {/* Nominated by: + {candidate.member.election_applications.map(({ nominator }, i) => { + return ( + {`${nominator.first_name} ${nominator.last_name}`} + ) + })} */} +
+
+
+ About {`${candidate.member.first_name} ${candidate.member.last_name}`} + +
+ + {`View ${candidate.member.first_name} ${candidate.member.last_name}'s full candidate profile and Q&A >>`} + +
+
+ + ) + })}
- - -
} @@ -296,33 +78,11 @@ const ElectionCandidatesPagePreviousTemplate = ({ candidates, electionStatus, to ) } -const ElectionCandidatesPagePrevious = ({ data, isLoggedUser, candidates, location, - getCandidates, electionStatus, getElectionStatus, loading }) => { - - useState(() => { - getCandidates(); - getElectionStatus(); - }, []) - - const [today, setToday] = useState(moment().utc().unix()) - const [ready, setReady] = useState(false) - - useEffect(() => { - fetch(`https://timeintervalsince1970.appspot.com/`) - .then(response => response.json()) - .then(resultData => { - if (resultData.timestamp) { - setToday(Math.trunc(resultData.timestamp) - 7200); - setReady(true); - } - }) - .catch(() => { - setToday(moment().utc().unix()); - setReady(true); - }) - }, []) - - const { markdownRemark: post } = data; +const ElectionCandidatesPagePrevious = ({ data, isLoggedUser, location }) => { + + const { markdownRemark: post, allCandidateData: { edges: candidateArray }, electionData } = data; + + const candidates = candidateArray.map(c => c.node); return ( @@ -335,12 +95,8 @@ const ElectionCandidatesPagePrevious = ({ data, isLoggedUser, candidates, locati
@@ -350,18 +106,12 @@ const ElectionCandidatesPagePrevious = ({ data, isLoggedUser, candidates, locati export default connect(state => ({ isLoggedUser: state.loggedUserState.isLoggedUser, - electionStatus: state.electionState.election_status, - candidates: state.electionState.candidates, - loading: state.electionState.loading -}), { - getCandidates, - getElectionStatus -} +}), {} )(ElectionCandidatesPagePrevious) export const electionCandidatesPagePreviousQuery = graphql` - query ElectionCandidatesPagePrevious($id: String!) { + query ElectionCandidatesPagePrevious($id: String!, $electionId: String) { markdownRemark(id: { eq: $id }) { html frontmatter { @@ -380,15 +130,23 @@ export const electionCandidatesPagePreviousQuery = graphql` twitterUsername } - menu { - text - link - } - title - howToVote { - title - description - } + title + } + } + electionData(id: {eq: $electionId}) { + closes + } + allCandidateData(filter: {election_id: {eq: $electionId}}) { + edges { + node { + id + bio + member { + first_name + last_name + pic + } + } } } } diff --git a/src/templates/election-gold-candidates-page-previous.js b/src/templates/election-gold-candidates-page-previous.js index 85672f271..85d53d7b4 100644 --- a/src/templates/election-gold-candidates-page-previous.js +++ b/src/templates/election-gold-candidates-page-previous.js @@ -1,6 +1,7 @@ import React, { useState } from "react" import { graphql } from 'gatsby'; import { connect } from 'react-redux' +import moment from 'moment-timezone'; import LinkComponent from "../components/LinkComponent" import Layout from '../components/Layout' import TopBar from "../components/TopBar"; @@ -8,187 +9,54 @@ import Navbar from "../components/Navbar"; import Header from "../components/Header"; import SEO from "../components/SEO"; -import { getGoldCandidates, getElectionStatus } from "../actions/election-actions"; +const ElectionGoldCandidatesPagePreviousTemplate = ({ goldCandidates, electionData }) => { -import { AjaxLoader } from "openstack-uicore-foundation/lib/components"; + const {closes} = electionData; -const ElectionGoldCandidatesPagePreviousTemplate = ({ intro, goldCandidates, loading, menu }) => { + const electionYear = moment(closes * 1000).utc().format('YYYY'); return (
-
- {!loading && goldCandidates && + {goldCandidates &&
-

{intro.title}

- +

Gold Director Selector Candidates

+ + "The candidates on this list are the intended Gold Directors from the Gold + Member companies who are running for election as Gold Director Selectors." +
- -
- Abhisak Chulya -

Abhisak Chulya

-
-
- About Abhisak Chulya - -

Dr. Abhisak has been involved in Internet circle in Asia Pacific since 1999. He was the secretariat of ccTLD for three years during which he had participated in almost every ICANN meetings through out the world. He has experienced and understanding of how big impact of Internet has on this region. He single-handedly organized APRICOT 2002 in Bangkok (https://www.apricot.net/apricot2002/about/index.html) and was a chairman of APIA serving for three terms from 2004 – 2006 (https://www.apia.org/pdf/AGM2004.pdf) Here is more details of Dr. Abhisak qualifications and work history: 

-

Abhisak received his doctoral degree in Engineering from Cleveland State University, USA and spent 8 years as a senior research scientist at NASA John H. Glenn Research Center in Cleveland, Ohio, USA. He published over 20 international publications as lead author including presentations in France, Japan, and USA.

-

Moving back home in 1996, he worked as a Director of Thailand Science Park. He later turned entrepreneur setting up his own company called NIPA Technology Co., Ltd. He is the former Executive Director for ccTLD Secretariat for Country Code Top Level Domain Name. He was also in charge of ccTLD Name Server Training Program which is part of AP Outreach Seminar - ccTLD Secretariat. 

-

He has been appointed by the Cabinet of Thai Government on 17 June 2003 to be a member of Board of Directors of National Science and Technology Development Agency, Ministry of Science and Technology, Thailand.

-
-
- View Abhisak Chulya's full candidate profile and Q&A >> -
-
-
- Clemens Hardewig -

Clemens Hardewig

-
-
- About Clemens Hardewig - -

Clemens is born in Germany and married with three kids, I have a PhD in computer science and worked in the communication industry in different managerial roles in IT.

-

Working for Deutsche Telekom-T-Systems since 1997,  IT wise Clemens grew up in the **ix space and became excited with Opensource and community work already early in my carrier. Since then, the use and promotion of Opensource Technology in the different stations of my carrier is one of the red lines Clemens always tried to facilitate and develop.

-

Being with Deutsche Telekom in different managerial roles, Clemens has been involved in depth  in Community Work as eg in the early days of Mobile Internet where I helped to develop the Wireless Application Protocol (WAP) Community as a accounable representative for DT.

-

After several years in Mobile Communications and traditional IT as Technical Manager, Clemens took the opportunity and leads since 2014 the Technology team within T-Systems which builds and delivers the Open Telekom Cloud (OTC), a public cloud offering in Europe based on Openstack and being currently accountable for the teams of architects, engineers, operations and consultants, all together being accountable for the technical delivery of the OTC service offering.

-
-
- View Clemens Hardewig's full candidate profile and Q&A >> -
-
-
- Edward Lee -

Edward Lee

-
-
About Edward LeeI am Edward Lee, I have nearly 15 years of R&D Product and open source experience in multiple fields, such as cloud, storage, big data and so on. - Currently I am the head of open source team in EasyStack inc, my major job is leading team members work in community including OpenInfra, CNCF, Linux as well as product development. I am going to setup the OSPO following the todogroup’s guides and willing to make much more efforts on communities. - Prior to that, I have two work experiences, the one is as the leader of development team for more than five years in Huawei. I was in charge of open source strategy making and leading a team with full-time engineers working in several projects e.g. Cinder, Manila, Swift, Kubernetes and so on, we made much effort on contribution and got some core members/maintainers. And also I was the founder and infrastructure architect of several new open source projects related Huawei, such as openEuler, openGauss. The another one is as developer with several years of experience in storage system, big data product development and design. -
- View Edward Lee's full candidate profile and Q&A >> -
-
-
- Grace Lian -

Grace Lian

-
-
- About Grace Lian - -

Grace Lian is a senior director of Cloud Software Engineering team in Intel. She leads a global team to work on open source cloud software technologies, including OpenStack, k8s, Kata containers, Cloud Hypervisor, Envoy, Istio, Ceph, and Akraino etc. She also drives the strategy in the cloud native software domains for Intel.

-

Grace is an open source veteran. She started to work on open source software from Carrier Grade Linux project back to 2001. She was engineering manager for the first Linux team in Intel China. The team became OTC (Open Source Technology Center) China and has grown many open source talents for the community. She has long time experience leading global engineering teams on open source software development, touching layers of system software (OS, Web/HTML5, virtualization, orchestration, SDN/NFV, SDS, cloud and edge etc.), bringing open source values to business and successfully supporting many customers.

-

Grace's team started to work on OpenStack since 2012. In the past years, her team has contributed significantly to OpenStack and Kata Containers upstream development, actively led, participated and promoted many community activities. Intel is also one of the members who started Kata Container project and StarlingX project, and contributed them to Open Infrastructure Foundation.

-
-
- View Grace Lian's full candidate profile and Q&A >> -
-
-
- Johan Christenson -

Johan Christenson

-
-
- About Johan Christenson - -

Johan Christenson is an entrepreneur whom has successfully exited multiple companies he founded. After receiving a graduate degree in Engineering, from Florida Institute of Technology, his focus turned to the digital space.

-

Johan is the founder and CEO of City Network (a part of Iver), which offers a global public cloud as well as private clouds for enterprises - all based on OpenStack. City Networks mission is to enable innovation and focuses on enterprises with regulatory challenges.

-

Johan sees OpenStack and open infrastructure as critical for all enterprises in order to provide options and create competition in an ever more centralized infrastructure world. He, and the team at City, empower new types of industries and markets to use the power of OpenStack, to enable and increase innovation in their organizations.

-
-
- View Johan Christenson's full candidate profile and Q&A >> -
-
-
- Li Kai -

Li Kai

-
-
- About Li Kai - -

I am Kai and am the CSO/Co-founder from 99CLOUD. I had been devoting myself for OpenStack for more than 9 years from 2012.  99CLOUD is one of the top code committer orgnization in OIF foundation.  We believe with Open Infra tech, we can some how change the world and help client better in their IT and bussiness transformation. I am currently in the OpenStack board in 2020. I am also in EdgeGallery (a MEC opensource project) as a baord member. Prior to 99CLOUD, I worked for Intel from 2006~2012 as a SW engineer and Accenture 2012~2014 as Cloud Manager.  

-
-
- View Li Kai's full candidate profile and Q&A >> -
-
-
- Pengju Jiao -

Pengju Jiao

-
-
- About Pengju Jiao - -

Pengju Jiao comes from China Mobile SuZhou R&D Center and he has been working here for 7 years. He currently serves as the leader of the Computing Product Group of the IaaS product department, taking responsibility for the R&D of the OpenStack team. ECloud has become the fastest-growing public cloud in China with the highest revenue growth rate in the past two years. As a member of the China Mobile Public Cloud architecture team, he participated in multi-phase projects of the ECloud and could be considered as the main contributor for guiding ECloud to join the Million Core Club. Pengju Jiao has considerable rich work experience in the development and operation of hyperscale public clouds. In these years, he led the OpenStack R&D team to achieve multiple great achievements, implementing the scheduling and concurrency optimization for hyperscale clusters carrying more than 100,000 servers. With this optimization, the delivery of 5 thousand cloud hosts could be completed in several minutes. 

-

Pengju Jiao is also very active to join community events. He once deeply joins many core community projects and make contributions as the Core and PTL for the Karbor. In addition, he is a frequenter in OpenStack Summit, China Day and Meet-up activities. His team has published dozens of speeches in OpenStack-related community activities based on his lead, sharing China Mobile’s practical and innovation experience in OpenStack.

-
-
- View Pengju Jiao's full candidate profile and Q&A >> -
-
-
- Shannon McFarland -

Shannon McFarland

-
-
- About Shannon McFarland - -

Shannon McFarland, CCIE #5245, is a Distinguished Engineer and Cloud Architect for Cloud Native and Application Infrastructure technologies at Cisco. He has been at Cisco for 22+ years. Shannon worked as a systems engineer at a system integrator for many years and as an end-user engineer in the medical industry prior to that.
-  
- Shannon has been involved with OpenStack since the Diablo release and has historically focused on Neutron, Heat, and Magnum related work. In addition, to OpenStack-specific projects, Shannon has been involved in the Kata Containers project. He is also working in the CNCF (Kubernetes, Network Service Mesh, Linkerd and OpenTelemetry) and Istio communities, with a distinct focus on all-things networking and observability. He is an author (“IPv6 for Enterprise Networks”) and a frequent speaker at various industry and community conferences to include OpenStack/Open Infrastructure Summits, Cisco Live, etc.
-  
- LinkedIn: https://www.linkedin.com/in/smcfarland/ -

-

 

-
-
- View Shannon McFarland's full candidate profile and Q&A >> -
-
-
- Tytus Kurek -

Tytus Kurek

-
-
- About Tytus Kurek - -

Tytus has been a member of the OpenInfra Foundation Board of Directors since 2020. He is a member of the Finance Committee and is actively involved in the OpenStack community. Over years he contributed numerous patches to the OpenStack codebase. He was also participating in the events organised by the OpenInfra Foundation, including summits and PTGs, supporting the foundation in its efforts to spread the awareness of open-source benefits.

-

As a Product Manager at Canonical, Tytus drives the evolution of Canonical’s products and services in the data centre space, including Canonical's Charmed OpenStack distribution. Tytus received his PhD with honours in telecommunications in 2018. His background is data centre administration and cloud engineering. His research interests focus on 5G networks, network function virtualisation, container network functions and unikernels.

-
-
- View Tytus Kurek's full candidate profile and Q&A >> -
-
-
- Xin Zhong -

Xin Zhong

-
-
- About Xin Zhong - -

Xin Zhong got his Master Degree from Tsinghua University in 2003. He has nearly 20 years of open source related experience. He is an expert in Linux OS, distributed storage and cloud computing. He has been involved in development and operation of several large-scale internet and enterprise cloud platform as technical director or chief architect. Currently, he is the Senior Architect of China Unicom Cloud (new brand of Wo Cloud). He represents China Unicom in all the foundation events. He and his team are very active in open source projects like openstack, ceph, etc. He has been Board Director in 2020.

-
-
- View Xin Zhong's full candidate profile and Q&A >> -
+ {goldCandidates.map((candidate, index) => { + return ( + <> +
+ {candidate.member.pic && {`${candidate.member.first_name}} +

{`${candidate.member.first_name} ${candidate.member.last_name}`}

+
+
+ About {`${candidate.member.first_name} ${candidate.member.last_name}`} + +
+ + {`View ${candidate.member.first_name} ${candidate.member.last_name}'s full candidate profile and Q&A >>`} + + {index + 1 < goldCandidates.length &&
} +
+ + ) + })}
@@ -201,14 +69,11 @@ const ElectionGoldCandidatesPagePreviousTemplate = ({ intro, goldCandidates, loa ) } -const ElectionGoldCandidatesPagePrevious = ({ data, isLoggedUser, goldCandidates, loading, location, getGoldCandidates, electionStatus, getElectionStatus }) => { +const ElectionGoldCandidatesPagePrevious = ({ data, isLoggedUser, location }) => { + + const { markdownRemark: post, allGoldCandidateData: { edges: candidateArray }, electionData } = data; - useState(() => { - getGoldCandidates(); - getElectionStatus(); - }, []) - - const { markdownRemark: post } = data; + const goldCandidates = candidateArray.map(c => c.node); return ( @@ -222,10 +87,7 @@ const ElectionGoldCandidatesPagePrevious = ({ data, isLoggedUser, goldCandidates isLoggedUser={isLoggedUser} location={location} goldCandidates={goldCandidates} - electionStatus={electionStatus} - loading={loading} - menu={post.frontmatter.menu} - intro={post.frontmatter.intro} + electionData={electionData} />
@@ -235,17 +97,11 @@ const ElectionGoldCandidatesPagePrevious = ({ data, isLoggedUser, goldCandidates export default connect(state => ({ isLoggedUser: state.loggedUserState.isLoggedUser, - electionStatus: state.electionState.election_status, - goldCandidates: state.electionState.gold_candidates, - loading: state.electionState.loading -}), { - getGoldCandidates, - getElectionStatus -} +}), {} )(ElectionGoldCandidatesPagePrevious) export const electionGoldCandidatesPagePreviousQuery = graphql` - query ElectionGoldCandidatesPagePrevious($id: String!) { + query ElectionGoldCandidatesPagePrevious($id: String!, $electionId: String) { markdownRemark(id: { eq: $id }) { html frontmatter { @@ -271,7 +127,23 @@ export const electionGoldCandidatesPagePreviousQuery = graphql` intro { title description - } + } + } + } + electionData(id: {eq: $electionId}) { + closes + } + allGoldCandidateData(filter: {election_id: {eq: $electionId}}) { + edges { + node { + id + bio + member { + first_name + last_name + pic + } + } } } } diff --git a/src/templates/election-page-previous.js b/src/templates/election-page-previous.js index 07102bf3d..c1f3f32e2 100644 --- a/src/templates/election-page-previous.js +++ b/src/templates/election-page-previous.js @@ -1,6 +1,7 @@ import React, { useEffect } from "react" import { connect } from 'react-redux' import { graphql } from 'gatsby'; +import moment from 'moment-timezone'; import Content, { HTMLContent } from '../components/Content' import Layout from '../components/Layout' import TopBar from "../components/TopBar"; @@ -8,25 +9,25 @@ import NavbarV2 from '../components/NavbarV2'; import Header from "../components/Header"; import SEO from "../components/SEO"; -import { getElectionStatus } from "../actions/election-actions" -import LinkComponent from "../components/LinkComponent"; - export const ElectionPagePreviousTemplate = ({ - electionStatus, isLoggedUser, title, - menu, + electionData, content, contentComponent }) => { - const PageContent = contentComponent || Content + const PageContent = contentComponent || Content + + const { closes, nomination_closes, nomination_opens, opens } = electionData + + const electionYear = moment(closes * 1000).utc().format('YYYY'); return (
-
+
@@ -40,21 +41,21 @@ export const ElectionPagePreviousTemplate = ({
+

+ Individual Member Director elections for the {title} will be held + {` ${moment(opens * 1000).utc().format('dddd MMMM DD, YYYY')} to + ${moment(closes * 1000).utc().format('dddd MMMM DD, YYYY')}`}. + Nominations occur between + {` ${moment(nomination_opens * 1000).utc().format('MMMM DD')} and + ${moment(nomination_closes * 1000).utc().format('MMMM DD, YYYY')}`}. +

@@ -66,22 +67,18 @@ export const ElectionPagePreviousTemplate = ({ ) } -const ElectionPagePrevious = ({ electionStatus, isLoggedUser, location, data, getElectionStatus }) => { - const { markdownRemark: post } = data; - - useEffect(() => { - getElectionStatus(); - }, []) +const ElectionPagePrevious = ({ isLoggedUser, location, data }) => { + const { markdownRemark: post, electionData } = data; return ( @@ -91,14 +88,10 @@ const ElectionPagePrevious = ({ electionStatus, isLoggedUser, location, data, ge export default connect(state => ({ isLoggedUser: state.loggedUserState.isLoggedUser, - electionStatus: state.electionState.election_status, -}), { - getElectionStatus -} -)(ElectionPagePrevious) +}), {})(ElectionPagePrevious) export const electionPagePreviousQuery = graphql` - query ElectionPagePrevious($id: String!) { + query ElectionPagePrevious($id: String!, $electionId: String) { markdownRemark(id: { eq: $id }) { html frontmatter { @@ -117,12 +110,15 @@ export const electionPagePreviousQuery = graphql` twitterUsername } title - subTitle - menu { - text - link - } + electionId } } + electionData(id: {eq: $electionId}) { + id + opens + closes + nomination_closes + nomination_opens + } } ` diff --git a/static/admin/config.yml b/static/admin/config.yml index 34ab18776..0ecdb57bf 100644 --- a/static/admin/config.yml +++ b/static/admin/config.yml @@ -1083,7 +1083,7 @@ collections: - name: "election-pages" label: "Election Pages" files: - - file: "src/pages/elections/current/index.md" + - file: "src/pages/election/index.md" label: "Election Page" name: "electionPage" fields: @@ -1102,7 +1102,7 @@ collections: { label: "Link", name: "link", widget: string, required: true } ] } - { label: "Body", name: body, widget: markdown, required: true } - - file: "src/pages/elections/current/candidates/index.md" + - file: "src/pages/election/candidates/index.md" label: "Election Page - Candidates" name: "electionCandidatesPage" fields: @@ -1123,7 +1123,7 @@ collections: { label: "Title", name: title, widget: string, required: true }, { label: "Description", name: description, widget: text, required: true } ] } - - file: "src/pages/elections/current/candidates/gold.md" + - file: "src/pages/election/candidates/gold/index.md" label: "Election Page - Candidates Gold" name: "electionGoldCandidatesPage" fields: @@ -1203,3 +1203,54 @@ collections: - { label: "Title", name: title, widget: string } - { label: "Sub Title", name: subTitle, widget: string } - { label: "Body", name: body, widget: markdown } + - name: "previous-election-pages" + label: "Previous Election Main Pages" + folder: "/src/pages/election/previous-elections" + editor: + preview: false + identifier_field: title + fields: + - { label: "Election Id", name: electionId, widget: hidden, required: true} + - { label: SEO, name: seo, widget: object, fields: [ + { label: "Title", name: "title", widget: string }, + { label: "Description", name: "description", widget: string }, + { label: "Url", name: "url", widget: string }, + { label: "Image", name: "image", widget: image }, + { label: "Twitter Username", name: "twitterUsername", widget: string }, + ] } + - { label: "Title", name: title, widget: string, required: true } + - { label: "Body", name: body, widget: markdown, required: true } + - name: "previous-election-page-candidates" + label: "Previous Election Candidate Pages" + folder: "/src/pages/election/previous-elections/candidates" + editor: + preview: false + identifier_field: title + fields: + - { label: "Election Id", name: electionId, widget: hidden, required: true } + - { label: SEO, name: seo, widget: object, fields: [ + { label: "Title", name: "title", widget: string }, + { label: "Description", name: "description", widget: string }, + { label: "Url", name: "url", widget: string }, + { label: "Image", name: "image", widget: image }, + { label: "Twitter Username", name: "twitterUsername", widget: string }, + ] } + - { label: "Title", name: title, widget: string, required: true } + - { label: "Body", name: body, widget: markdown, required: true } + - name: "previous-election-page-gold-candidates" + label: "Previous Election Gold Candidates Pages" + folder: "/src/pages/election/previous-elections/candidates/gold" + editor: + preview: false + identifier_field: title + fields: + - { label: "Election Id", name: electionId, widget: hidden, required: true } + - { label: SEO, name: seo, widget: object, fields: [ + { label: "Title", name: "title", widget: string }, + { label: "Description", name: "description", widget: string }, + { label: "Url", name: "url", widget: string }, + { label: "Image", name: "image", widget: image }, + { label: "Twitter Username", name: "twitterUsername", widget: string }, + ] } + - { label: "Title", name: title, widget: string, required: true } + - { label: "Body", name: body, widget: markdown, required: true } diff --git a/yarn.lock b/yarn.lock index 36b96d75e..9b18d8e6a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -21947,6 +21947,11 @@ yaml@^1.7.2, yaml@^1.8.3: dependencies: "@babel/runtime" "^7.9.2" +yaml@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.3.tgz#01f6d18ef036446340007db8e016810e5d64aad9" + integrity sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ== + yargs-parser@^18.1.2: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0"