You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by bd...@apache.org on 2019/07/25 15:27:57 UTC

[sling-whiteboard] branch master updated (28355e5 -> 538f7b3)

This is an automated email from the ASF dual-hosted git repository.

bdelacretaz pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/sling-whiteboard.git.


    from 28355e5  Mention microsling URL
     new 625b57c  Default renderers
     new 94b060a  OW renderer skeleton
     new 37a07d5  OpenWhisk renderer skeleton, WIP
     new 538f7b3  Openwhisk action selection based on annotations

The 4 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 serverless-microsling/install                      |  8 +-
 serverless-microsling/lib/openwhisk-renderer.js    | 59 +++++++++++++++
 serverless-microsling/lib/render.js                | 85 ++++++++++++++++++++--
 serverless-microsling/lib/resolve-content.js       |  6 +-
 serverless-microsling/microsling.js                | 13 ++--
 serverless-microsling/package-lock.json            | 40 ++++++++--
 serverless-microsling/package.json                 |  3 +
 .../somedoc-html.js}                               | 48 ++++++------
 8 files changed, 221 insertions(+), 41 deletions(-)
 create mode 100644 serverless-microsling/lib/openwhisk-renderer.js
 copy serverless-microsling/{lib/render.js => rendering-actions/somedoc-html.js} (50%)


[sling-whiteboard] 01/04: Default renderers

Posted by bd...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

bdelacretaz pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-whiteboard.git

commit 625b57c580c42e93ad6da06f577f02e135a88f45
Author: Bertrand Delacretaz <bd...@apache.org>
AuthorDate: Thu Jul 25 11:24:18 2019 +0200

    Default renderers
---
 serverless-microsling/lib/render.js          | 57 ++++++++++++++++++++++++----
 serverless-microsling/lib/resolve-content.js |  6 ++-
 serverless-microsling/microsling.js          | 13 ++++---
 3 files changed, 61 insertions(+), 15 deletions(-)

diff --git a/serverless-microsling/lib/render.js b/serverless-microsling/lib/render.js
index 74f6c3f..72cb2eb 100644
--- a/serverless-microsling/lib/render.js
+++ b/serverless-microsling/lib/render.js
@@ -16,10 +16,33 @@
 
  /* eslint-disable no-console */
 
-async function render(context) {
-  const resource = context.content.resource.content;
-  console.log(resource);
-  const markup = `
+const defaultTextRenderer = {
+  contentType: 'text/plain',
+  appliesTo : (resourceType, extension) => {
+    return extension == 'txt';
+  },
+  render : (resource) => {
+    return `${resource.title}\n${resource.body}\n`;
+  },
+}
+
+const defaultJsonRenderer = {
+  contentType: 'application/json',
+  appliesTo : (resourceType, extension) => {
+    return extension == 'json';
+  },
+  render : (resource) => {
+    return JSON.stringify(resource, 2, null);
+  },
+}
+
+const defaultHtmlRenderer = {
+  contentType: 'text/html',
+  appliesTo : (resourceType, extension) => {
+    return extension == 'html';
+  },
+  render : (resource) => {
+    return `
     <html>
     <head>
     <title>${resource.title}</title>
@@ -32,10 +55,28 @@ async function render(context) {
     </body>
     </html>
   `;
-  context.response.body = markup;
-  context.response.headers = {
-    'Content-Type': 'text/html',
-  };
+  },
+}
+
+const renderers = [
+  defaultTextRenderer,
+  defaultHtmlRenderer,
+  defaultJsonRenderer
+];
+
+async function render(context) {
+  const resource = context.content.resource.content;
+  if(context.debug) {
+    console.log(`rendering for resourceType ${resource.resourceType} extension ${context.request.extension}`);
+  }
+  renderers
+  .filter(r => r.appliesTo(resource.resourceType, context.request.extension))
+  .forEach(r => {
+    context.response.body = r.render(resource);
+    context.response.headers = {
+      'Content-Type': r.contentType
+    };
+  });
   return context;
 }
 
diff --git a/serverless-microsling/lib/resolve-content.js b/serverless-microsling/lib/resolve-content.js
index d40a894..dc1ad3c 100644
--- a/serverless-microsling/lib/resolve-content.js
+++ b/serverless-microsling/lib/resolve-content.js
@@ -17,9 +17,13 @@
 /* eslint-disable no-console */
 
 const fs = require('fs');
+const localFileSuffix = '.json';
 
 async function resolveContent(context) {
-  const filePath = `../content${context.request.path}`;
+  const parts = context.request.path.split('.');
+  context.request.extension = parts.pop();
+  context.request.resourcePath = parts.join('.');
+  const filePath = `../content${context.request.resourcePath}${localFileSuffix}`;
   return new Promise(resolve => {
     try {
       fs.readFile(require.resolve(filePath), (err, text) => {
diff --git a/serverless-microsling/microsling.js b/serverless-microsling/microsling.js
index cb7943c..c9de1b9 100644
--- a/serverless-microsling/microsling.js
+++ b/serverless-microsling/microsling.js
@@ -20,24 +20,24 @@ const { resolveContent } = require('./lib/resolve-content.js');
 const { render } = require('./lib/render.js');
 
 function main (params) {
-  const { debug } = params;
   const context = {
     request : {
       path: params.__ow_path,
     },
     response: {},
-    content: {}
+    content: {},
+    debug: params.debug
   };
 
   return new Promise(function (resolvePromise) {
-    if(debug) console.log(`start: ${JSON.stringify(context, 2, null)}`);
+    if(context.debug) console.log(`start: ${JSON.stringify(context, 2, null)}`);
     resolveContent(context)
     .then(context => {
-      if(debug) console.log(`pre-render: ${JSON.stringify(context, 2, null)}`);
+      if(context.debug) console.log(`pre-render: ${JSON.stringify(context, 2, null)}`);
       return render(context);
     })
     .then(context => {
-      if(debug) console.log(`pre-resolve: ${JSON.stringify(context, 2, null)}`);
+      if(context.debug) console.log(`pre-resolve: ${JSON.stringify(context, 2, null)}`);
       return resolvePromise(context.response);
     })
     .catch(e => {
@@ -60,9 +60,10 @@ const shellExec= async (input) => {
 if (require.main === module) {
   shellExec({
     // eslint-disable-next-line no-undef
+    debug: process.argv[3] || false,
+    // eslint-disable-next-line no-undef
     __ow_path: process.argv[2],
     __ow_method: 'get',
-    debug: false
   });
 }
 


[sling-whiteboard] 02/04: OW renderer skeleton

Posted by bd...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

bdelacretaz pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-whiteboard.git

commit 94b060a491626b24f7064052833d8d0cfac35f32
Author: Bertrand Delacretaz <bd...@apache.org>
AuthorDate: Thu Jul 25 11:39:25 2019 +0200

    OW renderer skeleton
---
 serverless-microsling/lib/render.js | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/serverless-microsling/lib/render.js b/serverless-microsling/lib/render.js
index 72cb2eb..6172af3 100644
--- a/serverless-microsling/lib/render.js
+++ b/serverless-microsling/lib/render.js
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+ const { openWhiskRenderer } = require('./openwhisk-renderer');
+
  /* eslint-disable no-console */
 
 const defaultTextRenderer = {
@@ -59,6 +61,7 @@ const defaultHtmlRenderer = {
 }
 
 const renderers = [
+  openWhiskRenderer,
   defaultTextRenderer,
   defaultHtmlRenderer,
   defaultJsonRenderer
@@ -69,14 +72,11 @@ async function render(context) {
   if(context.debug) {
     console.log(`rendering for resourceType ${resource.resourceType} extension ${context.request.extension}`);
   }
-  renderers
-  .filter(r => r.appliesTo(resource.resourceType, context.request.extension))
-  .forEach(r => {
-    context.response.body = r.render(resource);
-    context.response.headers = {
-      'Content-Type': r.contentType
-    };
-  });
+  const renderer = renderers.find(r => r.appliesTo(resource.resourceType, context.request.extension));
+  context.response.body = renderer.render(resource);
+  context.response.headers = {
+    'Content-Type': renderer.contentType
+  };
   return context;
 }
 


[sling-whiteboard] 04/04: Openwhisk action selection based on annotations

Posted by bd...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

bdelacretaz pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-whiteboard.git

commit 538f7b3bbe82109a89840d20fc5d8e15ac33c9ec
Author: Bertrand Delacretaz <bd...@apache.org>
AuthorDate: Thu Jul 25 17:27:46 2019 +0200

    Openwhisk action selection based on annotations
---
 serverless-microsling/lib/openwhisk-renderer.js | 41 +++++++++++++++++--------
 serverless-microsling/lib/render.js             |  2 +-
 2 files changed, 29 insertions(+), 14 deletions(-)

diff --git a/serverless-microsling/lib/openwhisk-renderer.js b/serverless-microsling/lib/openwhisk-renderer.js
index 9097096..e5544f7 100644
--- a/serverless-microsling/lib/openwhisk-renderer.js
+++ b/serverless-microsling/lib/openwhisk-renderer.js
@@ -23,22 +23,37 @@ const getAnnotation = (act, key) => {
   return annotation ? annotation.value : undefined;
 }
 
- const renderer = {
-  contentType: 'text/html_TODO',
-  appliesTo : async (resourceType, extension) => {
-    return new Promise(resolve => {
-      openwhisk().actions.list()
-      .then(actions => {
-        const act = actions.find(act => {
-          return resourceType == getAnnotation(act, 'sling:resourceType') && extension == getAnnotation(act, 'sling:extensions')
-        })
-        resolve(act);
-      });
+const getAction = async (resourceType, extension) => {
+  return new Promise(resolve => {
+    var ow = openwhisk();
+    ow.actions.list()
+    .then(actions => {
+      const act = actions.find(act => {
+        return resourceType == getAnnotation(act, 'sling:resourceType') && extension == getAnnotation(act, 'sling:extensions')
+      })
+      resolve(act);
+    })
+    .catch(e => {
+      throw e;
     })
+  })
+};
+
+ const renderer = {
+  contentType: 'text/html',
+  appliesTo : async (resourceType, extension) => { 
+    return getAction(resourceType, extension)
   },
   render : (resource, action) => {
-    console.log(`TODO: render using ${action}`);
+    return `TODO: render using ${action ? action.name : null}`;
   },
 }
 
-module.exports.openWhiskRenderer = renderer;
\ No newline at end of file
+function main () {
+  return new Promise(resolve => {
+    resolve(getAction('microsling/somedoc', 'html'));
+  });
+}
+
+module.exports.openWhiskRenderer = renderer;
+module.exports.main = main;
\ No newline at end of file
diff --git a/serverless-microsling/lib/render.js b/serverless-microsling/lib/render.js
index 168fb2e..b78b3c5 100644
--- a/serverless-microsling/lib/render.js
+++ b/serverless-microsling/lib/render.js
@@ -63,7 +63,7 @@ const defaultHtmlRenderer = {
 }
 
 const renderers = [
-  //openWhiskRenderer,
+  openWhiskRenderer,
   defaultTextRenderer,
   defaultHtmlRenderer,
   defaultJsonRenderer


[sling-whiteboard] 03/04: OpenWhisk renderer skeleton, WIP

Posted by bd...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

bdelacretaz pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-whiteboard.git

commit 37a07d5909cb5647d52ddb1e4b114a2f15c806e5
Author: Bertrand Delacretaz <bd...@apache.org>
AuthorDate: Thu Jul 25 17:04:17 2019 +0200

    OpenWhisk renderer skeleton, WIP
---
 serverless-microsling/install                      |  8 +++-
 serverless-microsling/lib/openwhisk-renderer.js    | 44 ++++++++++++++++++++
 serverless-microsling/lib/render.js                | 42 ++++++++++++++++---
 serverless-microsling/package-lock.json            | 40 +++++++++++++++---
 serverless-microsling/package.json                 |  3 ++
 .../rendering-actions/somedoc-html.js              | 48 ++++++++++++++++++++++
 6 files changed, 173 insertions(+), 12 deletions(-)

diff --git a/serverless-microsling/install b/serverless-microsling/install
index 0933969..8e5283e 100755
--- a/serverless-microsling/install
+++ b/serverless-microsling/install
@@ -15,6 +15,10 @@ echo Preparing $ZIP ... \
 && zip -r $ZIP $ACTION_FILES > /dev/null \
 && echo "$ZIP: $(du -h $ZIP | cut -f1)" \
 && echo "Updating action '$ACTION...'" \
-&& wsk action update $ACTION $ZIP --web true --kind nodejs:10
+&& wsk action update $ACTION $ZIP --web true --kind nodejs:10 --param debug true
+
+echo "Installing rendering actions..."
+wsk action update somedoc-rendering rendering-actions/somedoc-html.js -a sling:resourceType microsling/somedoc -a sling:extensions html
+
+echo "Microsling is available at at $(wsk -i action get $ACTION --url | grep http)"
 
-echo "Microsling is available at at $(wsk -i action get $ACTION --url | grep http)"
\ No newline at end of file
diff --git a/serverless-microsling/lib/openwhisk-renderer.js b/serverless-microsling/lib/openwhisk-renderer.js
new file mode 100644
index 0000000..9097096
--- /dev/null
+++ b/serverless-microsling/lib/openwhisk-renderer.js
@@ -0,0 +1,44 @@
+/* 
+ * Copyright 2019 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+ /* eslint-disable no-console */
+
+ const openwhisk = require('openwhisk');
+
+const getAnnotation = (act, key) => {
+  const annotation = act.annotations.find(ann => key == ann.key);
+  return annotation ? annotation.value : undefined;
+}
+
+ const renderer = {
+  contentType: 'text/html_TODO',
+  appliesTo : async (resourceType, extension) => {
+    return new Promise(resolve => {
+      openwhisk().actions.list()
+      .then(actions => {
+        const act = actions.find(act => {
+          return resourceType == getAnnotation(act, 'sling:resourceType') && extension == getAnnotation(act, 'sling:extensions')
+        })
+        resolve(act);
+      });
+    })
+  },
+  render : (resource, action) => {
+    console.log(`TODO: render using ${action}`);
+  },
+}
+
+module.exports.openWhiskRenderer = renderer;
\ No newline at end of file
diff --git a/serverless-microsling/lib/render.js b/serverless-microsling/lib/render.js
index 6172af3..168fb2e 100644
--- a/serverless-microsling/lib/render.js
+++ b/serverless-microsling/lib/render.js
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+'use strict';
+
  const { openWhiskRenderer } = require('./openwhisk-renderer');
 
  /* eslint-disable no-console */
@@ -61,22 +63,52 @@ const defaultHtmlRenderer = {
 }
 
 const renderers = [
-  openWhiskRenderer,
+  //openWhiskRenderer,
   defaultTextRenderer,
   defaultHtmlRenderer,
   defaultJsonRenderer
 ];
 
+async function getRendererInfo(resourceType, extension) {
+  return new Promise(async resolve => {
+    let i;
+    let resolved;
+    for(i in renderers) {
+      const applyContext = await renderers[i].appliesTo(resourceType, extension);
+      if(applyContext) {
+        resolve({
+          'renderer': renderers[i],
+          'applyContext': applyContext,
+        });
+        resolved = true;
+        break;
+      }
+    }
+    if(!resolved) {
+      resolve();
+    }
+  })
+}
+
 async function render(context) {
   const resource = context.content.resource.content;
+  const { resourceType } = resource;
+  const { extension } = context.request;
   if(context.debug) {
-    console.log(`rendering for resourceType ${resource.resourceType} extension ${context.request.extension}`);
+    console.log(`rendering for resourceType ${resourceType} extension ${extension}`);
   }
-  const renderer = renderers.find(r => r.appliesTo(resource.resourceType, context.request.extension));
-  context.response.body = renderer.render(resource);
+  const rendererInfo = await getRendererInfo(resourceType, extension);
+  if(context.debug) {
+    console.log(rendererInfo);
+  }
+  if(!rendererInfo) {
+    throw Error(`Renderer not found for ${resourceType} extension ${extension}`);
+  }
+  context.response.body = rendererInfo.renderer.render(resource, rendererInfo.applyContext);
   context.response.headers = {
-    'Content-Type': renderer.contentType
+    'Content-Type': rendererInfo.renderer.contentType
   };
+
   return context;
 }
 
diff --git a/serverless-microsling/package-lock.json b/serverless-microsling/package-lock.json
index abf7e7a..caa5fe4 100644
--- a/serverless-microsling/package-lock.json
+++ b/serverless-microsling/package-lock.json
@@ -645,7 +645,6 @@
       "version": "0.4.24",
       "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
       "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
-      "dev": true,
       "requires": {
         "safer-buffer": ">= 2.1.2 < 3"
       }
@@ -885,8 +884,7 @@
     "ms": {
       "version": "2.1.2",
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-      "dev": true
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
     },
     "mute-stream": {
       "version": "0.0.7",
@@ -900,6 +898,26 @@
       "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
       "dev": true
     },
+    "needle": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz",
+      "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==",
+      "requires": {
+        "debug": "^3.2.6",
+        "iconv-lite": "^0.4.4",
+        "sax": "^1.2.4"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.2.6",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+          "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        }
+      }
+    },
     "nice-try": {
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
@@ -966,6 +984,14 @@
         "mimic-fn": "^1.0.0"
       }
     },
+    "openwhisk": {
+      "version": "3.18.0",
+      "resolved": "https://registry.npmjs.org/openwhisk/-/openwhisk-3.18.0.tgz",
+      "integrity": "sha512-I+rbrL302xPJJhtUZMipXZXe0nik4D6nmr4hSIjHEgGMiSx+tjoIahOVlanASBhe4Er3K9WKFl3uC1tNRL9o9w==",
+      "requires": {
+        "needle": "^2.1.0"
+      }
+    },
     "optionator": {
       "version": "0.8.2",
       "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
@@ -1182,8 +1208,12 @@
     "safer-buffer": {
       "version": "2.1.2",
       "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
-      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
-      "dev": true
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+    },
+    "sax": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+      "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
     },
     "semver": {
       "version": "5.7.0",
diff --git a/serverless-microsling/package.json b/serverless-microsling/package.json
index a253344..5d58bf8 100644
--- a/serverless-microsling/package.json
+++ b/serverless-microsling/package.json
@@ -23,5 +23,8 @@
     "eslint": "^5.16.0",
     "eslint-config-airbnb-base": "^13.1.0",
     "eslint-plugin-import": "^2.17.3"
+  },
+  "dependencies": {
+    "openwhisk": "^3.18.0"
   }
 }
diff --git a/serverless-microsling/rendering-actions/somedoc-html.js b/serverless-microsling/rendering-actions/somedoc-html.js
new file mode 100644
index 0000000..ff29573
--- /dev/null
+++ b/serverless-microsling/rendering-actions/somedoc-html.js
@@ -0,0 +1,48 @@
+/* 
+ * Copyright 2019 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+ /* eslint-disable no-console */
+
+function main (params) {
+  const { resource } = params;
+  const markup = `<html>
+  <head>
+  <title>${resource.title}</title>
+  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/default.min.css"/>
+  </head>
+  <body>
+  <h1>
+      ${resource.title}
+  </h1>
+  <div>${resource.body}</div>
+  <div><em>This is the somedoc-html rendering</em></div>
+  </body>
+  </html>
+  `;
+  return {output: markup};
+}
+ 
+if (require.main === module) {
+  const input = {
+    resource: {
+      title: 'cmdline title',
+      body: 'cmdline body'
+    }
+  };
+  console.log(JSON.stringify(main(input), 2, null));
+}
+ 
+module.exports.main = main
\ No newline at end of file