الحوسبة بدون خادم على أساس OpenWhisk ، الجزء 3


يستمر هذا المقال في سلسلة من الملاحظات المترجمة حول OpenWhisk التي كتبها Priti Desai . سننظر اليوم في أمثلة لنشر وظائف Zip وتبعيات GitHub ، كما سنشرح بمزيد من التفصيل تزامن الكائنات بين العميل وخادم OpenWhisk.


وظائف الرمز البريدي


يدعم OpenWhisk إنشاء وظائف من ملف مصدر واحد ، كما كان [موضح سابقًا] (). كما يدعم إنشاء وظيفة باستخدام عدة ملفات برمز مصدر ومجموعة من الحزم التي تعتمد عليها الوظيفة. تسمى حالة الاستخدام هذه للوظائف وظيفة zip. دعنا نحاول نشر وظيفة zip باستخدام wskdeploy .


الخطوة الأولى


قم بإنشاء ملف بيان:


 packages: zipaction: actions: my-zip-action: function: actions/my-zip-action runtime: nodejs:6 inputs: name: Amy 

نعتقد أن my-zip-action لها بنية دليل تحتوي على الكود المصدري للوظيفة:


 $ ls actions/my-zip-action index.js package.json 

محتويات ملف index.js :


 function helloworld(params) { var format = require('string-format'); var name = params.name || 'Stranger'; payload = format('Hello, {}!', name) return { message: payload }; } exports.main = helloworld; 

محتويات ملف package.json :


 { "name": "my-zip-action", "description": "Node OpenWhisk zip action to demo Whisk Deploy", "license": "Apache-2.0", "version": "1.0.0", "main": "index.js", "dependencies": { "string-format": "0.5.0" } } 

الخطوة الثانية


قم بتشغيل npm install لتثبيت صيغة السلسلة:


 cd actions/my-action npm install --production 

الخطوة الثالثة


توسيع وظيفة الرمز البريدي:


 ./wskdeploy -i -p actions/my-zip-action/ ____ ___ _ _ _ _ _ /\ \ / _ \ _ __ ___ _ __ | | | | |__ (_)___| | __ /\ /__\ \ | | | | '_ \ / _ \ '_ \| | | | '_ \| / __| |/ / / \____ \ / | |_| | |_) | __/ | | | |/\| | | | | \__ \ < \ \ / \/ \___/| .__/ \___|_| |_|__/\__|_| |_|_|___/_|\_\ \___\/ |_| Packages: Name: zipaction bindings: * action: my-zip-action bindings: - name: name value: Amy Do you really want to deploy this? (y/N): y Deployment completed successfully. 

لقد نشرنا وظيفة zip my-zip-action string-format الوحدة التابعة. عند تحديد دليل في البيان باستخدام مفتاح function ، يتم إنشاء أرشيف مضغوط من هذا الدليل ، وكذلك وظيفة من هذا الأرشيف ، لذلك لا تحتاج إلى البحث عنه في نظام الملفات. بعد النشر ، يمكنك العمل مع الوظيفة الجديدة بنفس طريقة العمل مع الوظائف الأخرى.


تضمين واستبعاد للملفات في وظائف الرمز البريدي


يسمح لك OpenWhisk بإنشاء وظيفة باستخدام أرشيف مضغوط يحتوي على أي عدد من ملفات الوظيفة ، بما في ذلك كل إدماناتها. يدعم النشر تحديد function الدليل مع ملفات للوظيفة لكي تعمل. سيتم إنشاء أرشيف من محتويات الدليل ، حيث سيتم نشر الوظيفة بالفعل.


إدراج ملف


في السابق ، كان من الممكن تحديد مفتاح include ، والذي يعمل بنفس طريقة import بلغات البرمجة ، والذي سمح ، على سبيل المثال ، بعدة وظائف للإشارة إلى نفس المكتبة برمز:


 $ cd actions/ $ ls -1 ./ common/ greeting1/ greeting2/ manifest.yaml $ ls -1 common/ utils.js $ ls -1 greeting1/ index.js package.json $ ls -1 greeting2/ index.js package.json 

يمكنك مشاهدة ملف index.js في دليل greeting1 ، وكذلك ملف index.js آخر في دليل greeting2 ، ويشير كلاهما إلى utils.js الموجود في common/ .


محتويات ملف index.js الموجود في actions/greeting1/ :


 /** * Return a simple greeting message for someone. * * @param name A person's name. * @param place Where the person is from. */ var common = require('./common/utils.js') function main(params) { var name = params.name || params.payload || 'stranger'; var place = params.place || 'somewhere'; var hello = common.hello || 'Good Morning'; return {payload: hello + ', ' + name + ' from ' + place + '!'}; } exports.main = main; 

محتويات ملف index.js الموجود في actions/greeting2/ :


 /** * Return a simple greeting message for someone. * * @param name A person's name. * @param place Where the person is from. */ var common = require('./common/utils.js') function main(params) { var name = params.name || params.payload || 'stranger'; var place = params.place || 'somewhere'; var hello = common.hello || 'Good Evening'; return {payload: hello + ', ' + name + ' from ' + place + '!'}; } exports.main = main; 

داخل مفتاح include يحتوي على قائمة من الملفات أو الدلائل التي يجب تضمينها في الوظيفة. يجب أن يكون لكل عنصر في هذه القائمة source و / أو destination ، على سبيل المثال:


 include: - [source] - [source, destination] 

ملاحظات:


  • source يحتوي على المسار النسبي من الدليل الذي يحتوي على manimanifest.yaml . تعني destination المسار النسبي من دليل الوظائف ، على سبيل المثال ، actions/greeting1 actions/greeting2 في المثال التالي.
  • إذا لم destination تحديد destination ، فسيتم اعتبار أنها source نفسه.

محتويات ملف البيان:


 packages: zipactionwithinclude: actions: greeting1: function: actions/greeting1 runtime: nodejs:6 include: - ["actions/common/utils.js", "common/utils.js"] greeting2: function: actions/greeting2 runtime: nodejs:6 include: - ["actions/common/utils.js", "common/utils.js"] 

include الأعمال مع مجموعات مختلفة من source destination :


  • source فقط:

 include: - [actions/common/utils.js] 

باستخدام هذا الإدخال ، سيتم نسخ utils.js إلى actions/greeting/actions/common/utils.js ، ويمكن لـ index.js الرجوع إليها مثل هذا:


 var utils = require('./actions/common/utils.js') 

  • include مع إعادة تسمية:

 include: - ["actions/common/utils.js", "./common/myUtils.js"] 

باستخدام هذا التعريف ، سيتم وضع utils.js على طول مسار actions/greeting/common/myUtils.js ، وسوف يشير index.js إليه كما يلي:


 var utils = require('./common/myUtils.js') 

  • include بطريقة أخرى:

 include: - ["actions/common/utils.js", "./common/utility/utils.js"] 

في هذه الحالة ، سيتم نسخ utils.js إلى actions/greeting/common/utility/utils.js ، مع وجود رابط من index.js :


 var utils = require('./common/utility/utils.js') 

  • include مع الرمز * :

 include: - ["actions/common/*.js", "./common/"] 

في هذا الإصدار ، utils.js إلى جانب الملفات الأخرى ذات الامتداد .js إلى actions/greeting/common/ directory ، وفي index.js سيتم ربط هذه الملفات بالشكل التالي:


 var utils = require('./common/utils.js') 

إدراج الدليل


في include يمكنك تحديد دليل سيتم نسخه بشكل متكرر إلى الموقع المحدد قبل أن يتم تضمينه في الأرشيف. على سبيل المثال ، libs`` , index.js greeting3 / `` '':


 $ cd actions/ $ ls -1 libs/ greeting3/ manifest.yaml $ ls -1 libs/ lib1/ lib2/ lib3/ $ ls -1 libs/lib1/ utils.js $ ls -1 libs/lib2/ utils.js $ ls -1 libs/lib3/ utils.js $ ls -1 greeting3/ index.js package.json 

محتويات index.js في actions/greeting3/ الدليل:


 /** * Return a simple greeting message for someone. * * @param name A person's name. * @param place Where the person is from. */ var lib1 = require('./libs/lib1/utils.js') var lib2 = require('./libs/lib2/utils.js') var lib3 = require('./libs/lib3/utils.js') function main(params) { var name = params.name || params.payload || 'stranger'; var place = params.place || 'somewhere'; var hello = lib1.hello || lib2.hello || lib3.hello || 'Hello'; return {payload: hello + ', ' + name + ' from ' + place + '!'}; } exports.main = main; 

محتويات ملف البيان:


 packages: zipactionwithinclude: actions: greeting3: function: actions/greeting3 runtime: nodejs:6 include: - ["actions/libs/*", "libs/"] 

في هذا المثال ، يتم نسخ دليل libs بالكامل بشكل متكرر إلى actions/greeting3/libs/ .


ربط الدلائل بالرمز * :


  • مثال 1:

 include: - ["actions/libs/*/utils.js", "libs/"] 

عند كتابة هذه utils.js سيتم نسخ جميع الدلائل الفرعية التي تحتوي على utils.js من libs . تبدو الروابط من index.js كما يلي:


 var lib1 = require('./libs/lib1/utils.js') var lib2 = require('./libs/lib2/utils.js') var lib3 = require('./libs/lib3/utils.js') 

  • مثال 2:

 include: - ["actions/*/*/utils.js"] 

باستخدام هذا الإدخال ، سيتم نسخ جميع الأدلة الفرعية التي تطابق القناع وتحتوي على utils.js . سيكون الوصول من index.js مثل هذا:


 var lib1 = require('./actions/libs/lib1/utils.js') var lib2 = require('./actions/libs/lib2/utils.js') var lib3 = require('./actions/libs/lib3/utils.js') 

  • مثال 3:

 include: - ["actions/*/*/utils.js", "actions/"] 

يشير هذا المثال صراحة إلى مكان نسخ كل شيء. سيكون الوصول من index.js هو نفسه كما في المثال السابق.


استثناء


يمكن استخدام كلمة exclude الرئيسية كقائمة من الملفات والدلائل ، ويُسمح باستخدام قناع في شكل حرف * . مثال للاستخدام:


 exclude: - actions/common/*.js - actions/libs/*/utils.js 

مثال شائع للمشاركة include exclude :


 packages: zipactionwithexclude: actions: greeting1: function: actions runtime: nodejs:6 exclude: - actions/* include: - ["actions/common/utils.js", "common/utils.js"] - ["actions/index.js", "index.js"] - ["actions/package.json", "package.json"] 

وظائف مع تبعيات جيثب


يدعم OpenWhisk التبعيات ، بحيث يمكنك وصف حزم OpenWhisk الأخرى التي يعتمد عليها مشروعنا. باستخدام هذه التبعيات ، سوف يقوم OpenWhisk بنشر الحزم التابعة تلقائيًا أيضًا. يمكن اعتبار أي حزمة بها manifest.yaml و \ أو deployment.yaml كحزمة تابعة ، والتي يمكن تحديدها في بيان مشروعنا. يمكنك وصف مثل هذه التبعية في البيان في قسم dependencies :


 packages: RootProject: dependencies: helloworlds: location: github.com/apache/incubator-openwhisk-test/packages/helloworlds triggers: trigger1: trigger2: rules: rule1: trigger: trigger1 action: helloworlds/hello-js rule2: trigger: trigger2 action: helloworlds/helloworld-js 

في هذا المثال ، helloworlds عبارة عن حزمة خارجية مستضافة على مستودع GitHub على https://github.com/apache/incubator-openwhisk-test . سيتم نشر حزمة helloworlds بناءً على ملفاتها للنشر في دليل packages/helloworlds - عند نشر مشروع RootProject بنا. من الممكن أيضًا تغيير اسم الحزمة التابعة ، على سبيل المثال ، بدلاً من helloworlds بتعيين ChildProject :


 packages: RootProject: dependencies: ChildProject: location: github.com/apache/incubator-openwhisk-test/packages/helloworlds triggers: trigger1: trigger2: rules: rule1: trigger: trigger1 action: ChildProject/hello-js rule2: trigger: trigger2 action: ChildProject/helloworld-js 

يمكنك إضافة تبعيات متعددة إلى حزم متعددة:


 packages: RootProject: dependencies: ChildProject1: location: github.com/apache/incubator-openwhisk-test/packages/helloworlds ChildProject2: location: github.com/apache/incubator-openwhisk-test/packages/hellowhisk sequences: ChildProject1-series: actions: ChildProject1/hello-js, ChildProject1/helloworld-js ChildProject2-series: actions: ChildProject2/greeting, ChildProject2/httpGet triggers: trigger1: trigger2: rules: rule1: trigger: trigger1 action: ChildProject1-series rule2: trigger: trigger2 action: ChildProject2-series 

كيف تزامن مشاريع OpenWhisk بين العميل والخادم


للإجابة ، يجب أن تبدأ النشر في وضع managed deployment . في هذا الوضع ، ينشر OpenWhisk جميع الكائنات من البيان ، كما يرفق أيضًا وصفًا مخفيًا لكل منها ، ما يسمى managed . هذا الوصف يشبه هذا:


 managed: __OW_PROJECT_NAME: MyProjectName __OW_PROJECT_HASH: SHA1("OpenWhisk " + <size_of_manifest_file> + "\0" + <contents_of_manifest_file>) __OW_FILE: Absolute path of manifest file on file system 

هنا ، OpenWhisk عبارة عن سلسلة ثابتة ، و "\ 0" هي الحرف NULL. size_of_manifest_file و content_of_manifest_file يعتمدان على الملف. يقوم تسلسل نشر المشروع نفسه في وضع managed deployment بحساب __OW_PROJECT_HASH جديد على العميل لكل كائن ومقارنته بكائن __OW_PROJECT_HASH من نفس المشروع على الخادم. هناك العديد من الخيارات أدناه.


الخيار الأول : إذا __OW_PROJECT_HASH على العميل والخادم ، أي: إذا لم تكن هناك تغييرات على المشروع من جانب العميل ، فسيظل المشروع على الخادم كما هو ، باستثناء wskdeploy خلال wskdeploy كائنات جديدة من البيان لتلقي أي تغييرات في ملف wskdeploy .


الخيار 2 : إذا كان __OW_PROJECT_HASH غير متطابق ، على سبيل المثال إذا كانت هناك تغييرات على جانب العميل ، wskdeploy بنشر جميع الكائنات من البيان ، ثم يقوم بتحديثها __OW_PROJECT_HASH على الخادم. wskdeploy أيضًا عن جميع الكائنات: بما في ذلك الدالات والتسلسلات __OW_PROJECT_NAME الشرطية التي لها نفس __OW_PROJECT_NAME ، أي ينتمي إلى نفس المشروع ولكن له __OW_PROJECT_HASH مختلف ، حيث يمكن إزالته من البيان على العميل. اسم المشروع في البيان مطلوب لمزامنة المشروع بين العميل والخادم:


 project: name: MyProjectName packages: package1: .... 

تظل الكائنات الموجودة في OpenWhisk التي تشكل جزءًا من المشروع ولكنها يتم نشرها باستخدام أدوات أو أدوات التشغيل الآلي الأخرى كما هي دون تغيير عند إزالتها من المشروع. تعتبر كائنات خارجية وبالتالي لا يتم الكتابة. يمكنك wskdeploy مثل هذا المشروع باستخدام wskdeploy ، وتوجيهه إلى ملف البيان ، والذي يحتوي فقط على اسم المشروع:


 project: name: MyProjectName 

دعونا نلقي نظرة على مشروع نموذج لفهم managed deployment . في هذا المخزون ، يمكنك رؤية المشروع بالعديد من البيانات التي تعرض managed deployment .


الخطوة الأولى


نشر MyFirstManagedProject باستخدام وضع managed deployment :


 $wskdeploy -m tests/src/integration/managed-deployment/manifest.yaml --managed Deployment completed successfully. 


قائمة الكائنات المنشورة على خادم OpenWhisk



وصف العقار


الخطوة الثانية


نقوم بمزامنة العميل والخادم - نحذف ManagedPackage-2:


 ./wskdeploy -m tests/src/integration/managed-deployment/00-manifest-minus-second-package.yaml --managed Deployment completed successfully. 


قائمة الكائنات بعد الحذف في MyFirstManagedProject


الخطوة الثالثة


نقوم بمزامنة العميل والخادم - نحذف التسلسل ManagedSequence-2:


 ./wskdeploy -m tests/src/integration/managed-deployment/01-manifest-minus-sequence-2.yaml --managed Deployment completed successfully. 


قائمة الكائنات بعد الحذف


الخطوة الرابعة


حذف وظيفة Helloworld-3:


 ./wskdeploy -m tests/src/integration/managed-deployment/02-manifest-minus-action-3.yaml --managed Deployment completed successfully. 


قائمة الكائنات بعد الحذف


الخطوة الخامسة


حذف ManagedPackage-1:


 ./wskdeploy -m tests/src/integration/managed-deployment/04-manifest-minus-package.yaml --managed Deployment completed successfully. 


كائنات أخرى في MyFirstManagedProject


مقالات دورة أخرى


الحوسبة بدون خادم على أساس OpenWhisk ، الجزء 1
الحوسبة بدون خادم على أساس OpenWhisk ، الجزء 2
الحوسبة بدون خادم على أساس OpenWhisk ، الجزء 3
الحوسبة بدون خادم على أساس OpenWhisk ، الجزء 4

Source: https://habr.com/ru/post/ar479492/


All Articles