Skip to content

Commit de48eda

Browse files
committed
Add component implementation
1 parent 211452a commit de48eda

File tree

3 files changed

+115
-0
lines changed

3 files changed

+115
-0
lines changed

serverless.component.yml

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
name: kubernetes-configmap
2+
version: 0.1.0
3+
author: pmuens
4+
org: pmuens
5+
keywords: kubernetes, serverless
6+
repo: https://github.com/serverless-components/kubernetes-configmap
7+
license: Apache-2.0
8+
main: ./src

src/package.json

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"name": "@serverless/kubernetes-configmap",
3+
"version": "0.1.0",
4+
"main": "./serverless.js",
5+
"publishConfig": {
6+
"access": "public"
7+
},
8+
"scripts": {
9+
"test": "echo \"Error: no test specified\" && exit 1"
10+
},
11+
"author": "Serverless, Inc.",
12+
"license": "Apache",
13+
"dependencies": {
14+
"@kubernetes/client-node": "^0.11.1"
15+
}
16+
}

src/serverless.js

+91
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
const kubernetes = require('@kubernetes/client-node')
2+
const { Component } = require('@serverless/core')
3+
4+
const defaults = {
5+
namespace: 'default',
6+
data: {}
7+
}
8+
9+
class KubernetesConfigMap extends Component {
10+
async deploy(inputs = {}) {
11+
const config = {
12+
...defaults,
13+
...inputs
14+
}
15+
16+
const k8sCore = this.getKubernetesClient(kubernetes.CoreV1Api)
17+
18+
let configMapExists = true
19+
try {
20+
await this.readConfigMap(k8sCore, config)
21+
} catch (error) {
22+
configMapExists = error.response.body.code === 404 ? false : true
23+
}
24+
25+
if (!configMapExists) {
26+
await this.createConfigMap(k8sCore, config)
27+
}
28+
29+
this.state = config
30+
return this.state
31+
}
32+
33+
async remove(inputs = {}) {
34+
const config = {
35+
...defaults,
36+
...inputs,
37+
...this.state
38+
}
39+
40+
const k8sCore = this.getKubernetesClient(kubernetes.CoreV1Api)
41+
42+
await this.deleteConfigMap(k8sCore, config)
43+
44+
this.state = {}
45+
return {}
46+
}
47+
48+
// "private" methods
49+
getKubernetesClient(type) {
50+
const { endpoint, port } = this.credentials.kubernetes
51+
const token = this.credentials.kubernetes.serviceAccountToken
52+
const skipTLSVerify = this.credentials.kubernetes.skipTlsVerify ? true : false
53+
const kc = new kubernetes.KubeConfig()
54+
kc.loadFromOptions({
55+
clusters: [
56+
{
57+
name: 'cluster',
58+
skipTLSVerify,
59+
server: `${endpoint}:${port}`
60+
}
61+
],
62+
users: [{ name: 'user', token }],
63+
contexts: [
64+
{
65+
name: 'context',
66+
user: 'user',
67+
cluster: 'cluster'
68+
}
69+
],
70+
currentContext: 'context'
71+
})
72+
return kc.makeApiClient(type)
73+
}
74+
75+
async createConfigMap(k8s, { name, namespace, data }) {
76+
return k8s.createNamespacedConfigMap(namespace, {
77+
metadata: { name },
78+
data
79+
})
80+
}
81+
82+
async readConfigMap(k8s, { name, namespace }) {
83+
return k8s.readNamespacedConfigMap(name, namespace)
84+
}
85+
86+
async deleteConfigMap(k8s, { name, namespace }) {
87+
return k8s.deleteNamespacedConfigMap(name, namespace)
88+
}
89+
}
90+
91+
module.exports = KubernetesConfigMap

0 commit comments

Comments
 (0)