| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536 |
- // Licensed to Cloudera, Inc. under one
- // or more contributor license agreements. See the NOTICE file
- // distributed with this work for additional information
- // regarding copyright ownership. Cloudera, Inc. licenses this file
- // to you 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.
- // Since knockout maps arrays without calling "update" nor "create"
- // Provide a JSON string that will be parsed in custom 'create' and 'update' functions.
- // These serialized values are also stored in the backend.
- var MODEL_FIELDS_JSON = ['parameters', 'job_properties', 'files', 'archives', 'prepares', 'params',
- 'deletes', 'mkdirs', 'moves', 'chmods', 'touchzs'];
- function normalize_model_fields(node_model) {
- $.each(MODEL_FIELDS_JSON, function(index, field) {
- if (field in node_model && $.isArray(node_model[field])) {
- node_model[field] = JSON.stringify(node_model[field]);
- }
- });
- return node_model;
- }
- // Parse JSON if it is JSON and appropriately map.
- // Apply subscriber to each mapping.
- var map_params = function(options, subscribe) {
- options.data = ($.type(options.data) == "string") ? $.parseJSON(options.data) : options.data;
- if ($.isArray(options.data)) {
- var mapping = ko.mapping.fromJS(options.data);
- $.each(mapping(), function(index, value) {
- subscribe(value);
- });
- return mapping;
- } else {
- var mapping = ko.mapping.fromJS(options.data, {});
- subscribe(mapping);
- return mapping;
- }
- };
- // Maps JSON strings to fields in the view model.
- var MAPPING_OPTIONS = {
- ignore: ['initialize', 'toString', 'copy'],
- job_properties: {
- create: function(options) {
- var parent = options.parent;
- var subscribe = function(mapping) {
- mapping.name.subscribe(function(value) {
- parent.job_properties.valueHasMutated();
- });
- mapping.value.subscribe(function(value) {
- parent.job_properties.valueHasMutated();
- });
- };
- return map_params(options, subscribe);
- },
- update: function(options) {
- var parent = options.parent;
- var subscribe = function(mapping) {
- mapping.name.subscribe(function(value) {
- parent.job_properties.valueHasMutated();
- });
- mapping.value.subscribe(function(value) {
- parent.job_properties.valueHasMutated();
- });
- };
- return map_params(options, subscribe);
- }
- },
- files: {
- create: function(options) {
- return map_params(options, function() {});
- },
- update: function(options) {
- return map_params(options, function() {});
- }
- },
- archives: {
- create: function(options) {
- var parent = options.parent;
- var subscribe = function(mapping) {
- mapping.name.subscribe(function(value) {
- parent.archives.valueHasMutated();
- });
- mapping.dummy.subscribe(function(value) {
- parent.archives.valueHasMutated();
- });
- };
- return map_params(options, subscribe);
- },
- update: function(options) {
- var parent = options.parent;
- var subscribe = function(mapping) {
- mapping.name.subscribe(function(value) {
- parent.archives.valueHasMutated();
- });
- mapping.dummy.subscribe(function(value) {
- parent.archives.valueHasMutated();
- });
- };
- return map_params(options, subscribe);
- }
- },
- params: {
- create: function(options) {
- var parent = options.parent;
- var subscribe = function(mapping) {
- mapping.value.subscribe(function(value) {
- parent.params.valueHasMutated();
- });
- mapping.type.subscribe(function(value) {
- parent.params.valueHasMutated();
- });
- };
- return map_params(options, subscribe);
- },
- update: function(options) {
- var parent = options.parent;
- var subscribe = function(mapping) {
- mapping.value.subscribe(function(value) {
- parent.params.valueHasMutated();
- });
- mapping.type.subscribe(function(value) {
- parent.params.valueHasMutated();
- });
- };
- return map_params(options, subscribe);
- }
- },
- prepares: {
- create: function(options) {
- var parent = options.parent;
- var subscribe = function(mapping) {
- mapping.value.subscribe(function(value) {
- parent.prepares.valueHasMutated();
- });
- mapping.type.subscribe(function(value) {
- parent.prepares.valueHasMutated();
- });
- };
- return map_params(options, subscribe);
- },
- update: function(options) {
- var parent = options.parent;
- var subscribe = function(mapping) {
- mapping.value.subscribe(function(value) {
- parent.prepares.valueHasMutated();
- });
- mapping.type.subscribe(function(value) {
- parent.prepares.valueHasMutated();
- });
- };
- return map_params(options, subscribe);
- }
- },
- deletes: {
- create: function(options) {
- return map_params(options, function() {});
- }
- },
- mkdirs: {
- create: function(options) {
- return map_params(options, function() {});
- }
- },
- moves: {
- create: function(options) {
- var parent = options.parent;
- var subscribe = function(mapping) {
- mapping.source.subscribe(function(value) {
- parent.moves.valueHasMutated();
- });
- mapping.destination.subscribe(function(value) {
- parent.moves.valueHasMutated();
- });
- };
- return map_params(options, subscribe);
- }
- },
- chmods: {
- create: function(options) {
- var parent = options.parent;
- var subscribe = function(mapping) {
- mapping.path.subscribe(function(value) {
- parent.chmods.valueHasMutated();
- });
- mapping.permissions.subscribe(function(value) {
- parent.chmods.valueHasMutated();
- });
- mapping.recursive.subscribe(function(value) {
- parent.chmods.valueHasMutated();
- });
- };
- return map_params(options, subscribe);
- }
- },
- touchzs: {
- create: function(options) {
- return map_params(options, function() {});
- }
- }
- };
- var ModelModule = function($) {
- var module = function(attrs) {
- var self = this;
- $.extend(self, attrs);
- module.prototype.initialize.apply(self, arguments);
- return self;
- };
- $.extend(module.prototype, {
- // Normal stuff
- initialize: function(){},
- toString: function() {
- var self = this;
- return JSON.stringify(self, null, '\t');
- },
- copy: function() {
- var self = this;
- var model = $.extend(true, {}, self);
- $.each(MODEL_FIELDS_JSON, function(i, field) {
- if (field in model && $.type(model[field]) != "string") {
- model[field] = JSON.stringify(model[field]);
- }
- });
- return model;
- }
- });
- return module;
- };
- var WorkflowModel = ModelModule($);
- $.extend(WorkflowModel.prototype, {
- id: 0,
- name: '',
- description: '',
- start: 0,
- end: 0,
- schema_version: 0.4,
- deployment_dir: '',
- is_shared: true,
- parameters: '[]',
- job_xml: ''
- });
- var NodeModel = ModelModule($);
- $.extend(NodeModel.prototype, {
- id: 0,
- name: '',
- description: '',
- node_type: '',
- workflow: 0,
- child_links: []
- });
- var ForkModel = ModelModule($);
- $.extend(ForkModel.prototype, {
- id: 0,
- name: '',
- description: '',
- node_type: 'fork',
- workflow: 0,
- child_links: []
- });
- var DecisionModel = ModelModule($);
- $.extend(DecisionModel.prototype, {
- id: 0,
- name: '',
- description: '',
- node_type: 'decision',
- workflow: 0,
- child_links: []
- });
- var DistCPModel = ModelModule($);
- $.extend(DistCPModel.prototype, {
- id: 0,
- name: '',
- description: '',
- node_type: 'distcp',
- workflow: 0,
- job_properties: '[]',
- prepares: '[]',
- job_xml: '',
- params: '[]',
- child_links: []
- });
- var MapReduceModel = ModelModule($);
- $.extend(MapReduceModel.prototype, {
- id: 0,
- name: '',
- description: '',
- node_type: 'mapreduce',
- workflow: 0,
- files: '[]',
- archives: '[]',
- job_properties: '[]',
- jar_path: '',
- prepares: '[]',
- job_xml: '',
- child_links: []
- });
- var StreamingModel = ModelModule($);
- $.extend(StreamingModel.prototype, {
- id: 0,
- name: '',
- description: '',
- node_type: 'streaming',
- workflow: 0,
- files: '[]',
- archives: '[]',
- job_properties: '[]',
- mapper: '',
- reducer: '',
- child_links: []
- });
- var JavaModel = ModelModule($);
- $.extend(JavaModel.prototype, {
- id: 0,
- name: '',
- description: '',
- node_type: 'java',
- workflow: 0,
- files: '[]',
- archives: '[]',
- job_properties: '[]',
- jar_path: '',
- prepares: '[]',
- job_xml: '',
- main_class: '',
- args: '',
- java_opts: '',
- capture_output: false,
- child_links: []
- });
- var PigModel = ModelModule($);
- $.extend(PigModel.prototype, {
- id: 0,
- name: '',
- description: '',
- node_type: 'pig',
- workflow: 0,
- files: '[]',
- archives: '[]',
- job_properties: '[]',
- prepares: '[]',
- job_xml: '',
- params: '[]',
- script_path: '',
- child_links: []
- });
- var HiveModel = ModelModule($);
- $.extend(HiveModel.prototype, {
- id: 0,
- name: '',
- description: '',
- node_type: 'hive',
- workflow: 0,
- files: '[]',
- archives: '[]',
- job_properties: '[]',
- prepares: '[]',
- job_xml: '',
- params: '[]',
- script_path: '',
- child_links: []
- });
- var SqoopModel = ModelModule($);
- $.extend(SqoopModel.prototype, {
- id: 0,
- name: '',
- description: '',
- node_type: 'sqoop',
- workflow: 0,
- files: '[]',
- archives: '[]',
- job_properties: '[]',
- prepares: '[]',
- job_xml: '',
- params: '[]',
- script_path: '',
- child_links: []
- });
- var ShellModel = ModelModule($);
- $.extend(ShellModel.prototype, {
- id: 0,
- name: '',
- description: '',
- node_type: 'shell',
- workflow: 0,
- files: '[]',
- archives: '[]',
- job_properties: '[]',
- prepares: '[]',
- job_xml: '',
- params: '[]',
- command: '',
- capture_output: false,
- child_links: []
- });
- var SshModel = ModelModule($);
- $.extend(SshModel.prototype, {
- id: 0,
- name: '',
- description: '',
- node_type: 'ssh',
- workflow: 0,
- user: '',
- host: '',
- params: '[]',
- command: '',
- capture_output: false,
- child_links: []
- });
- var FsModel = ModelModule($);
- $.extend(FsModel.prototype, {
- id: 0,
- name: '',
- description: '',
- node_type: 'fs',
- workflow: 0,
- deletes: '[]',
- mkdirs: '[]',
- moves: '[]',
- chmods: '[]',
- touchzs: '[]',
- child_links: []
- });
- var EmailModel = ModelModule($);
- $.extend(EmailModel.prototype, {
- id: 0,
- name: '',
- description: '',
- node_type: 'email',
- workflow: 0,
- to: '',
- cc: '',
- subject: '',
- body: '',
- child_links: []
- });
- var SubWorkflowModel = ModelModule($);
- $.extend(SubWorkflowModel.prototype, {
- id: 0,
- name: '',
- description: '',
- node_type: 'subworkflow',
- workflow: 0,
- sub_workflow: 0,
- propagate_configuration: true,
- job_properties: '[]',
- child_links: []
- });
- var GenericModel = ModelModule($);
- $.extend(GenericModel.prototype, {
- id: 0,
- name: '',
- description: '',
- node_type: 'generic',
- workflow: 0,
- xml: '',
- child_links: []
- });
- function nodeModelChooser(node_type) {
- switch(node_type) {
- case 'mapreduce':
- return MapReduceModel;
- case 'streaming':
- return StreamingModel;
- case 'java':
- return JavaModel;
- case 'pig':
- return PigModel;
- case 'hive':
- return HiveModel;
- case 'sqoop':
- return SqoopModel;
- case 'shell':
- return ShellModel;
- case 'ssh':
- return SshModel;
- case 'distcp':
- return DistCPModel;
- case 'fs':
- return FsModel;
- case 'email':
- return EmailModel;
- case 'subworkflow':
- return SubWorkflowModel;
- case 'generic':
- return GenericModel;
- case 'fork':
- return ForkModel;
- case 'decision':
- return DecisionModel;
- default:
- return NodeModel;
- }
- }
|