| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF 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. |
| */ |
| (function () { |
| 'use strict'; |
| |
| describe('EntitySerializer', function () { |
| var serializer; |
| beforeEach(module('app.services.entity.serializer', 'dateHelper')); |
| |
| |
| beforeEach(inject(function(EntitySerializer, DateHelper) { |
| serializer = EntitySerializer; |
| })); |
| |
| describe('deserialize feed', function() { |
| |
| it('Should copy the general information', function() { |
| |
| var feedModel = { |
| feed: { |
| _xmlns: "uri:falcon:feed:0.1", |
| _name: 'FeedName', |
| _description: 'Feed Description' |
| } |
| }; |
| |
| var feed = serializer.preDeserialize(feedModel, 'feed'); |
| |
| expect(feed.name).toBe(feedModel.feed._name); |
| expect(feed.description).toBe(feedModel.feed._description); |
| expect(feed.xmlns).toBe(undefined); |
| }); |
| |
| it('Should copy tags', function() { |
| |
| var feedModel = { |
| feed: { |
| tags: 'owner=USMarketing,classification=Secure' |
| } |
| }; |
| |
| var feed = serializer.preDeserialize(feedModel, 'feed'); |
| |
| expect(feed.tags[0].key).toBe('owner'); |
| expect(feed.tags[0].value).toBe('USMarketing'); |
| expect(feed.tags[1].key).toBe('classification'); |
| expect(feed.tags[1].value).toBe('Secure'); |
| }); |
| |
| it('Should copy groups', function() { |
| |
| var feedModel = { |
| feed: { |
| groups: 'churnAnalysisDataPipeline,Group2,Group3' |
| } |
| }; |
| |
| var feed = serializer.preDeserialize(feedModel, 'feed'); |
| |
| expect(feed.groups).toBe(feedModel.feed.groups); |
| }); |
| |
| it('Should copy ACL', function() { |
| var feedModel = { |
| feed: { |
| ACL: {_owner: 'ambari-qa', _group: 'users', _permission: '0755' } |
| } |
| }; |
| |
| var feed = serializer.preDeserialize(feedModel, 'feed'); |
| |
| expect(feed.ACL.owner).toBe(feedModel.feed.ACL._owner); |
| expect(feed.ACL.group).toBe(feedModel.feed.ACL._group); |
| expect(feed.ACL.permission).toBe(feedModel.feed.ACL._permission); |
| }); |
| |
| it('Should copy Schema', function() { |
| var feedModel = { |
| feed: { |
| schema: {_location: '/location', _provider: 'provider'} |
| } |
| }; |
| |
| var feed = serializer.preDeserialize(feedModel, 'feed'); |
| |
| expect(feed.schema.location).toBe(feedModel.feed.schema._location); |
| expect(feed.schema.provider).toBe(feedModel.feed.schema._provider); |
| }); |
| |
| it('Should copy frequency', function() { |
| var feedModel = { |
| feed: { |
| frequency: 'hours(20)' |
| } |
| }; |
| |
| var feed = serializer.preDeserialize(feedModel, 'feed'); |
| |
| expect(feed.frequency.unit).toBe('hours'); |
| expect(feed.frequency.quantity).toBe('20'); |
| }); |
| |
| it('Should copy late arrival', function() { |
| var feedModel = { |
| feed: { |
| "late-arrival": {"_cut-off": 'days(10)'} |
| } |
| }; |
| |
| var feed = serializer.preDeserialize(feedModel, 'feed'); |
| |
| expect(feed.lateArrival.active).toBe(true); |
| expect(feed.lateArrival.cutOff.unit).toBe('days'); |
| expect(feed.lateArrival.cutOff.quantity).toBe('10'); |
| }); |
| |
| it('Should not copy late arrival when is not present', function() { |
| var feedModel = { |
| feed: {} |
| }; |
| |
| var feed = serializer.preDeserialize(feedModel, 'feed'); |
| |
| expect(feed.lateArrival.active).toBe(true); |
| expect(feed.lateArrival.cutOff.unit).toBe('hours'); |
| expect(feed.lateArrival.cutOff.quantity).toBe(4); |
| }); |
| |
| it('Should copy availabilityFlag', function() { |
| var feedModel = { |
| feed: { |
| availabilityFlag: 'Available' |
| } |
| }; |
| |
| var feed = serializer.preDeserialize(feedModel, 'feed'); |
| |
| expect(feed.availabilityFlag).toBe(feedModel.feed.availabilityFlag); |
| }); |
| |
| it('Should not copy availabilityFlag if not present in the xml', function() { |
| var feedModel = { |
| feed: {} |
| }; |
| |
| var feed = serializer.preDeserialize(feedModel, 'feed'); |
| |
| expect(feed.availabilityFlag).toBe("_success"); |
| }); |
| |
| it('Should copy custom properties', function() { |
| var feedModel = { |
| feed: { |
| properties: {property: [ |
| {_name: 'Prop1', _value: 'Value1'}, |
| {_name: 'Prop2', _value: 'Value2'} |
| ]} |
| } |
| }; |
| |
| var feed = serializer.preDeserialize(feedModel, 'feed'); |
| |
| expect(feed.customProperties.length).toBe(3); |
| expect(feed.customProperties[1].key).toBe('Prop1'); |
| expect(feed.customProperties[1].value).toBe('Value1'); |
| expect(feed.customProperties[2].key).toBe('Prop2'); |
| expect(feed.customProperties[2].value).toBe('Value2'); |
| }); |
| |
| it('Should not copy falcon properties into the custom properties', function() { |
| var feedModel = { |
| feed: { |
| properties: {property: [ |
| {_name: 'queueName', _value: 'QueueName'}, |
| {_name: 'Prop1', _value: 'Value1'} |
| ]} |
| } |
| }; |
| |
| var feed = serializer.preDeserialize(feedModel, 'feed'); |
| |
| expect(feed.customProperties.length).toBe(2); |
| expect(feed.customProperties[0].key).toBe(null); |
| expect(feed.customProperties[0].value).toBe(null); |
| expect(feed.customProperties[1].key).toBe('Prop1'); |
| expect(feed.customProperties[1].value).toBe('Value1'); |
| }); |
| |
| it('Should copy queueName properties into properties', function() { |
| var feedModel = { |
| feed: { |
| properties: {property: [ |
| {_name: 'queueName', _value: 'QueueName'}, |
| {_name: 'Prop1', _value: 'Value1'} |
| ]} |
| } |
| }; |
| |
| var feed = serializer.preDeserialize(feedModel, 'feed'); |
| |
| expect(feed.properties.length).toBe(5); |
| expect(feed.properties[0].key).toBe('queueName'); |
| expect(feed.properties[0].value).toBe('QueueName'); |
| }); |
| |
| it('Should leave the default properties if no properties appear on the xml and copy the new ones', function() { |
| var feedModel = { |
| feed: { |
| properties: { |
| property: [ |
| {_name: 'jobPriority', _value: 'MEDIUM'} |
| ] |
| } |
| } |
| }; |
| |
| |
| var feed = serializer.preDeserialize(feedModel, 'feed'); |
| |
| expect(feed.properties.length).toBe(5); |
| |
| expect(feed.properties[0].key).toBe('queueName'); |
| expect(feed.properties[0].value).toBe('default'); |
| expect(feed.properties[1].key).toBe('jobPriority'); |
| expect(feed.properties[1].value).toBe('MEDIUM'); |
| }); |
| |
| it('Should copy file system locations', function() { |
| var feedModel = { |
| feed: { |
| locations: {location: [ |
| {_type: 'data', _path: '/none1'}, |
| {_type: 'stats', _path: '/none2'} |
| ]} |
| } |
| }; |
| |
| var feed = serializer.preDeserialize(feedModel, 'feed'); |
| var locations = feed.storage.fileSystem.locations; |
| |
| expect(locations.length).toBe(2); |
| expect(locations[0].type).toBe('data'); |
| expect(locations[0].path).toBe('/none1'); |
| expect(locations[1].type).toBe('stats'); |
| expect(locations[1].path).toBe('/none2'); |
| }); |
| |
| it('Should not copy file system locations if they are not defined and keep the defaults', function() { |
| var feedModel = { |
| feed: { |
| dataTransferType: 'hdfs', |
| } |
| }; |
| |
| var feed = serializer.preDeserialize(feedModel, 'feed'); |
| |
| expect(feed.storage.fileSystem.locations).toBe(null); |
| }); |
| |
| it('Should not copy catalog uri if not present', function() { |
| var feedModel = { |
| feed: { |
| dataTransferType: 'hive', |
| } |
| }; |
| |
| var feed = serializer.preDeserialize(feedModel, 'feed'); |
| |
| expect(feed.storage.catalog.catalogTable.uri).toBe(null); |
| }); |
| |
| it('Should copy cluster name and type', function() { |
| var feedModel = { |
| feed: { |
| clusters: { |
| cluster: [{ |
| _name: 'ClusterOne', |
| _type: 'target' |
| }] |
| } |
| } |
| }; |
| |
| var feed = serializer.preDeserialize(feedModel, 'feed'); |
| |
| expect(feed.clusters.length).toBe(1); |
| expect(feed.clusters[0].name).toBe('ClusterOne'); |
| expect(feed.clusters[0].type).toBe('target'); |
| }); |
| |
| it('Should copy clusters and select the first source cluster', function() { |
| var feedModel = { |
| feed: { |
| clusters: { |
| cluster: [ |
| {_name: 'ClusterOne', _type: 'target'}, |
| {_name: 'ClusterTwo', _type: 'source'}, |
| {_name: 'ClusterThree', _type: 'target'}, |
| {_name: 'ClusterFour', _type: 'source'} |
| ] |
| } |
| } |
| }; |
| |
| var feed = serializer.preDeserialize(feedModel, 'feed'); |
| |
| expect(feed.clusters[0].selected).toBe(false); |
| expect(feed.clusters[1].selected).toBe(true); |
| expect(feed.clusters[2].selected).toBe(false); |
| expect(feed.clusters[3].selected).toBe(false); |
| |
| }); |
| |
| xit('Should copy validity', function() { |
| var feedModel = { |
| feed: { |
| clusters: {cluster: [{_name: 'ClusterOne', _type: 'target', |
| validity: { |
| _start: '2014-02-28T01:20Z', |
| _end: '2016-03-31T04:30Z' |
| } |
| }]} |
| } |
| }; |
| |
| var feed = serializer.preDeserialize(feedModel, 'feed'); |
| |
| expect(feed.clusters[0].validity.start.date).toEqual(new Date(2014, 2, 28,0,0)); |
| expect(feed.clusters[0].validity.start.time).toEqual(newUtcTime(1, 20)); |
| expect(feed.clusters[0].validity.end.date).toEqual(newUtcDate(2016, 3, 31)); |
| expect(feed.clusters[0].validity.end.time).toEqual(newUtcTime(4, 30)); |
| |
| }); |
| |
| it('Should copy retention', function() { |
| var feedModel = { |
| feed: { |
| clusters: {cluster: [{_name: 'ClusterOne', _type: 'target', |
| retention: { |
| _limit: 'weeks(4)', |
| _action: 'delete' |
| } |
| }]} |
| } |
| }; |
| |
| var feed = serializer.preDeserialize(feedModel, 'feed'); |
| |
| expect(feed.clusters[0].retention.quantity).toBe('4'); |
| expect(feed.clusters[0].retention.unit).toBe('weeks'); |
| expect(feed.clusters[0].retention.action).toBe('delete'); |
| }); |
| |
| it('Should copy clusters locations', function() { |
| var feedModel = { |
| feed: { |
| dataTransferType: 'hdfs', |
| clusters: {cluster: [{_name: 'ClusterOne', _type: 'target', |
| locations: { |
| location: [ |
| {_type: 'data', _path: '/path1'}, |
| {_type: 'stats', _path: '/path2'} |
| ]} |
| }]} |
| } |
| }; |
| |
| var feed = serializer.preDeserialize(feedModel, 'feed'); |
| var locations = feed.clusters[0].storage.fileSystem.locations; |
| |
| expect(locations.length).toBe(2); |
| expect(locations[0].type).toBe('data'); |
| expect(locations[0].path).toBe('/path1'); |
| expect(locations[1].type).toBe('stats'); |
| expect(locations[1].path).toBe('/path2'); |
| }); |
| |
| it('filesystem should be inactive if there are no locations', function() { |
| var feedModel = { |
| feed: { |
| dataTransferType: 'hdfs', |
| clusters: {cluster: [{_name: 'ClusterOne', _type: 'target', |
| locations: { |
| location: []} |
| }]} |
| } |
| }; |
| |
| var feed = serializer.preDeserialize(feedModel, 'feed'); |
| var locations = feed.clusters[0].storage.fileSystem.locations; |
| expect(locations.length).toBe(0); |
| }); |
| |
| it('Should copy catalog uri', function() { |
| var feedModel = { |
| feed: { |
| clusters: {cluster: [{_name: 'ClusterOne', _type: 'target', |
| table: { |
| _uri : 'table:uri' |
| } |
| }]} |
| } |
| }; |
| |
| var feed = serializer.preDeserialize(feedModel, 'feed'); |
| var catalogStorage = feed.clusters[0].storage.catalog; |
| expect(catalogStorage.catalogTable.uri).toBe('table:uri'); |
| }); |
| |
| it('Should copy timezone', function() { |
| var feedModel = { |
| feed: { |
| timezone: 'GMT+03:50' |
| } |
| }; |
| |
| var feed = serializer.preDeserialize(feedModel, 'feed'); |
| |
| expect(feed.timezone).toBe('GMT+03:50'); |
| }); |
| |
| }); |
| |
| describe('serialize feed into xml', function() { |
| |
| it('Should transform the basic properties', function () { |
| var feed = { |
| name: 'FeedName', |
| description: 'Feed Description', |
| groups: 'a,b,c' |
| }; |
| |
| var xml = serializer.serialize(feed, 'feed'); |
| |
| expect(xml).toBe( |
| "<feed xmlns='uri:falcon:feed:0.1' name='FeedName' description='Feed Description'>" + |
| "<groups>a,b,c</groups>" + |
| "</feed>" |
| ); |
| |
| }); |
| |
| it('Should transform tags properly', function () { |
| var feed = {name: 'FeedName', |
| tags: [{key: 'key1', value: 'value1'}, {key: 'key2', value: 'value2'}, {key: null, value: 'value3'}] |
| }; |
| |
| var xml = serializer.serialize(feed, 'feed'); |
| |
| expect(xml).toBe( |
| "<feed xmlns='uri:falcon:feed:0.1' name='FeedName'>" + |
| "<tags>key1=value1,key2=value2</tags>" + |
| "</feed>" |
| ); |
| |
| }); |
| |
| //it('Should transform ACL properly', function () { |
| // var feed = {name: 'FeedName', |
| // ACL: {owner: 'ambari-qa', group: 'users', permission: '0755'} |
| // }; |
| // |
| // var xml = serializer.serialize(feed, 'feed'); |
| // |
| // expect(xml).toBe( |
| // "<feed xmlns='uri:falcon:feed:0.1' name='FeedName'>" + |
| // "<ACL owner='ambari-qa' group='users' permission='0755'/>" + |
| // "</feed>" |
| // ); |
| // |
| //}); |
| |
| it('Should add an ACL element even though the properties are empty', function () { |
| var feed = {name: 'FeedName', |
| ACL: {owner: null, group: null, permission: null} |
| }; |
| |
| var xml = serializer.serialize(feed, 'feed'); |
| |
| expect(xml).toBe( |
| "<feed xmlns='uri:falcon:feed:0.1' name='FeedName'>" + |
| "<ACL/>" + |
| "</feed>" |
| ); |
| |
| }); |
| |
| it('Should transform schema properly', function () { |
| var feed = {name: 'FeedName', |
| schema: {location: '/location', provider: 'none'} |
| }; |
| |
| var xml = serializer.serialize(feed, 'feed'); |
| |
| expect(xml).toBe( |
| "<feed xmlns='uri:falcon:feed:0.1' name='FeedName'>" + |
| "<schema location='/location' provider='none'/>" + |
| "</feed>" |
| ); |
| |
| }); |
| |
| it('Should add the schema element even though the properties are empty', function () { |
| var feed = {name: 'FeedName', |
| schema: {location: null, provider: null} |
| }; |
| |
| var xml = serializer.serialize(feed, 'feed'); |
| |
| expect(xml).toBe( |
| "<feed xmlns='uri:falcon:feed:0.1' name='FeedName'>" + |
| "<schema/>" + |
| "</feed>" |
| ); |
| |
| }); |
| |
| it('Should transform frequency properly', function () { |
| var feed = {name: 'FeedName', |
| frequency: {quantity: 4, unit: 'weeks'} |
| }; |
| |
| var xml = serializer.serialize(feed, 'feed'); |
| |
| expect(xml).toBe( |
| "<feed xmlns='uri:falcon:feed:0.1' name='FeedName'>" + |
| "<frequency>weeks(4)</frequency>" + |
| "</feed>" |
| ); |
| |
| }); |
| |
| it('Should transform late arrival properly when defined', function () { |
| var feed = {name: 'FeedName', |
| lateArrival: {active: true, cutOff: {quantity: 22, unit: 'hours'}} |
| }; |
| |
| var xml = serializer.serialize(feed, 'feed'); |
| |
| expect(xml).toBe( |
| "<feed xmlns='uri:falcon:feed:0.1' name='FeedName'>" + |
| "<late-arrival cut-off='hours(22)'/>" + |
| "</feed>" |
| ); |
| |
| }); |
| |
| it('Should not transform late arrival properly when quantity is not defined', function () { |
| var feed = {name: 'FeedName', |
| lateArrival: {active: false, cutOff: {quantity: null, unit: 'hours'}} |
| }; |
| |
| var xml = serializer.serialize(feed, 'feed'); |
| |
| expect(xml).toBe( |
| "<feed xmlns='uri:falcon:feed:0.1' name='FeedName'/>" |
| ); |
| |
| }); |
| |
| it('Should transform availability flag', function () { |
| var feed = {name: 'FeedName', |
| availabilityFlag: 'Available' |
| }; |
| |
| var xml = serializer.serialize(feed, 'feed'); |
| |
| expect(xml).toBe( |
| "<feed xmlns='uri:falcon:feed:0.1' name='FeedName'>" + |
| "<availabilityFlag>Available</availabilityFlag>" + |
| "</feed>" |
| ); |
| |
| }); |
| |
| it('Should transform timezone', function () { |
| var feed = {name: 'FeedName', |
| timezone: 'GMT+1:00' |
| }; |
| |
| var xml = serializer.serialize(feed, 'feed'); |
| |
| expect(xml).toBe( |
| "<feed xmlns='uri:falcon:feed:0.1' name='FeedName'>" + |
| "<timezone>GMT+1:00</timezone>" + |
| "</feed>" |
| ); |
| |
| }); |
| |
| //it('Should transform queueName, jobPriority and timeout and custom properties', function () { |
| // var feed = {name: 'FeedName', |
| // properties: [ |
| // {key: 'queueName', value: 'Queue'}, |
| // {key: 'jobPriority', value: 'HIGH'}, |
| // {key: 'timeout', value: {quantity: 7, unit: 'weeks'}} |
| // ], |
| // customProperties: [ |
| // {key: 'custom1', value: 'value1'}, |
| // {key: 'custom2', value: 'value2'} |
| // ] |
| // }; |
| // |
| // var xml = serializer.serialize(feed, 'feed'); |
| // |
| // expect(xml).toBe( |
| // "<feed xmlns='uri:falcon:feed:0.1' name='FeedName'>" + |
| // "<properties>" + |
| // "<property name='queueName' value='Queue'></property>" + |
| // "<property name='jobPriority' value='HIGH'></property>" + |
| // "<property name='timeout' value='weeks(7)'></property>" + |
| // "<property name='custom1' value='value1'></property>" + |
| // "<property name='custom2' value='value2'></property>" + |
| // "</properties>" + |
| // "</feed>" |
| // ); |
| // |
| //}); |
| |
| it('Should transform not add queueName nor timeout if they were not defined', function () { |
| var feed = {name: 'FeedName', |
| properties: [ |
| {key: 'queueName', value: null}, |
| {key: 'jobPriority', value: 'HIGH'}, |
| {key: 'timeout', value: {quantity: 2, unit: 'months'}} |
| ] |
| }; |
| |
| var xml = serializer.serialize(feed, 'feed'); |
| |
| expect(xml).toBe( |
| "<feed xmlns='uri:falcon:feed:0.1' name='FeedName'>" + |
| "<properties>" + |
| "<property name='jobPriority' value='HIGH'></property>" + |
| "<property name='timeout' value='months(2)'></property>" + |
| "</properties>" + |
| "</feed>" |
| ); |
| |
| }); |
| |
| it('Should transform locations properly if file system storage is active', function () { |
| var feed = {name: 'FeedName', |
| dataTransferType: 'hdfs', |
| storage: { |
| fileSystem: { |
| active: true, |
| locations: [ |
| {type: 'data', path: '/none1'}, |
| {type: 'stats', path: '/none2'} |
| ] |
| } |
| } |
| }; |
| |
| var xml = serializer.serialize(feed, 'feed'); |
| |
| expect(xml).toBe( |
| "<feed xmlns='uri:falcon:feed:0.1' name='FeedName'>" + |
| "<locations>" + |
| "<location type='data' path='/none1'></location>" + |
| "<location type='stats' path='/none2'></location>" + |
| "</locations>" + |
| "</feed>" |
| ); |
| |
| }); |
| |
| it('Should not transform locations properly if file system storage is not active', function () { |
| var feed = {name: 'FeedName', |
| storage: { |
| fileSystem: { |
| active: false, |
| locations: [ |
| {type: 'data', path: '/none1'}, |
| {type: 'stats', path: '/none2'} |
| ] |
| } |
| } |
| }; |
| |
| var xml = serializer.serialize(feed, 'feed'); |
| |
| expect(xml).toBe( |
| "<feed xmlns='uri:falcon:feed:0.1' name='FeedName'/>" |
| ); |
| |
| }); |
| |
| it('Should transform catalog properly if catalog storage is active', function () { |
| var feed = {name: 'FeedName', |
| dataTransferType: 'hive', |
| storage: { |
| catalog: { |
| active: true, |
| catalogTable: {uri: '/none'} |
| } |
| } |
| }; |
| |
| var xml = serializer.serialize(feed, 'feed'); |
| |
| expect(xml).toBe( |
| "<feed xmlns='uri:falcon:feed:0.1' name='FeedName'>" + |
| "<table uri='/none'/>" + |
| "</feed>" |
| ); |
| |
| }); |
| |
| it('Should not transform catalog if catalog storage is not active', function () { |
| var feed = {name: 'FeedName', |
| storage: { |
| catalog: { |
| active: false, |
| catalogTable: {uri: '/none'} |
| } |
| } |
| }; |
| |
| var xml = serializer.serialize(feed, 'feed'); |
| |
| expect(xml).toBe( |
| "<feed xmlns='uri:falcon:feed:0.1' name='FeedName'/>" |
| ); |
| |
| }); |
| |
| xit('Should transform clusters', function () { |
| var feed = {name: 'FeedName', |
| storage: { |
| fileSystem: {active: true, locations: [ |
| {type: 'data', path: '/masterpath'} |
| ]}, |
| catalog: {active: true, catalogTable: {uri: '/masteruri'}} |
| }, |
| clusters: [ |
| { |
| name: 'primaryCluster', |
| type: 'source', |
| validity: {start: {date: newUtcDate(2014, 2, 28), time: newUtcTime(0,0)}, end: {date: newUtcDate(2016, 4, 1), time: newUtcTime(0,0)}}, |
| retention: {quantity: 2, unit: 'hours', action: 'delete'}, |
| storage: { |
| fileSystem: { |
| active: true, |
| locations: [ |
| {type: 'data', path: '/none1'}, |
| {type: 'stats', path: '/none2'} |
| ] |
| }, |
| catalog: { |
| active: false, |
| catalogTable: {uri: '/primaryuri'} |
| } |
| } |
| }, |
| { |
| name: 'secondaryCluster', |
| type: 'target', |
| validity: {start: {date: newUtcDate(2015, 2, 28), time: newUtcTime(0,0)}, end: {date: newUtcDate(2017, 4, 1), time: newUtcTime(0,0)}}, |
| retention: {quantity: 5, unit: 'weeks', action: 'archive'}, |
| storage: { |
| fileSystem: { |
| active: true, |
| locations: [ |
| {type: 'data', path: '/none4'}, |
| {type: 'stats', path: '/none5'} |
| ] |
| }, |
| catalog: { |
| active: true, |
| catalogTable: {uri: '/secondaryuri'} |
| } |
| } |
| } |
| ] |
| }; |
| |
| var xml = serializer.serialize(feed, 'feed'); |
| |
| expect(xml).toBe( |
| "<feed xmlns='uri:falcon:feed:0.1' name='FeedName'>" + |
| "<clusters>" + |
| "<cluster name='primaryCluster' type='source'>" + |
| "<validity start='2014-02-28T00:00Z' end='2016-04-01T00:00Z'/>" + |
| "<retention limit='hours(2)' action='delete'/>" + |
| "<locations>" + |
| "<location type='data' path='/none1'></location>" + |
| "<location type='stats' path='/none2'></location>" + |
| "</locations>" + |
| "<table uri='/primaryuri'/>" + |
| "</cluster>" + |
| "<cluster name='secondaryCluster' type='target'>" + |
| "<validity start='2015-02-28T00:00Z' end='2017-04-01T00:00Z'/>" + |
| "<retention limit='weeks(5)' action='archive'/>" + |
| "<locations>" + |
| "<location type='data' path='/none4'></location>" + |
| "<location type='stats' path='/none5'></location>" + |
| "</locations>" + |
| "<table uri='/secondaryuri'/>" + |
| "</cluster>" + |
| "</clusters>" + |
| "<locations>" + |
| "<location type='data' path='/masterpath'></location>" + |
| "</locations>" + |
| "<table uri='/masteruri'/>" + |
| "</feed>" |
| ); |
| |
| }); |
| |
| }); |
| |
| describe('deserialize process', function() { |
| |
| it('Should copy the general information', function() { |
| |
| var processModel = { |
| process: { |
| _xmlns: "uri:falcon:process:0.1", |
| _name: 'ProcessName' |
| } |
| }; |
| |
| var process = serializer.preDeserialize(processModel, 'process'); |
| |
| expect(process.name).toBe(processModel.process._name); |
| expect(process.xmlns).toBe(undefined); |
| }); |
| |
| it('Should copy tags', function() { |
| |
| var processModel = { |
| process: { |
| tags: 'owner=USMarketing,classification=Secure' |
| } |
| }; |
| |
| var process = serializer.preDeserialize(processModel, 'process'); |
| |
| expect(process.tags[0].key).toBe('owner'); |
| expect(process.tags[0].value).toBe('USMarketing'); |
| expect(process.tags[1].key).toBe('classification'); |
| expect(process.tags[1].value).toBe('Secure'); |
| }); |
| |
| it('Should copy workflow', function() { |
| |
| var processModel = { |
| process: {_xmlns: "uri:falcon:process:0.1", _name: 'ProcessName', |
| workflow: { |
| _name: 'emailCleanseWorkflow', |
| _version: '5.0', |
| _engine: 'pig', |
| _path: '/user/ambari-qa/falcon/demo/apps/pig/id.pig' |
| } |
| } |
| }; |
| |
| var process = serializer.preDeserialize(processModel, 'process'); |
| |
| expect(process.workflow.name).toBe(processModel.process.workflow._name); |
| expect(process.workflow.version).toBe(processModel.process.workflow._version); |
| expect(process.workflow.engine).toBe(processModel.process.workflow._engine); |
| expect(process.workflow.path).toBe(processModel.process.workflow._path); |
| |
| }); |
| |
| it('Should copy timezone', function() { |
| |
| var processModel = { |
| process: {_xmlns: "uri:falcon:process:0.1", _name: 'ProcessName', |
| timezone: 'GMT+1:00' |
| } |
| }; |
| |
| var process = serializer.preDeserialize(processModel, 'process'); |
| |
| expect(process.timezone).toBe(processModel.process.timezone); |
| }); |
| |
| it('Should copy frequency', function() { |
| var processModel = {process: { |
| frequency: 'hours(20)' |
| }}; |
| |
| var process = serializer.preDeserialize(processModel, 'process'); |
| |
| expect(process.frequency.unit).toBe('hours'); |
| expect(process.frequency.quantity).toBe('20'); |
| |
| }); |
| |
| it('Should copy parallel', function() { |
| var processModel = { process: { |
| parallel: 3 |
| }}; |
| |
| var process = serializer.preDeserialize(processModel, 'process'); |
| |
| expect(process.parallel).toBe(processModel.process.parallel); |
| |
| }); |
| |
| it('Should copy order', function() { |
| var processModel = { process: { |
| order: 'LIFO' |
| }}; |
| |
| var process = serializer.preDeserialize(processModel, 'process'); |
| |
| expect(process.order).toBe(processModel.process.order); |
| |
| }); |
| |
| it('Should copy retry', function() { |
| var processModel = { process: { |
| retry: { |
| _policy: 'periodic', _attempts: '3', _delay: 'minutes(15)' |
| } |
| }}; |
| |
| var process = serializer.preDeserialize(processModel, 'process'); |
| |
| expect(process.retry.policy).toBe(processModel.process.retry._policy); |
| expect(process.retry.attempts).toBe(processModel.process.retry._attempts); |
| expect(process.retry.delay.quantity).toBe('15'); |
| expect(process.retry.delay.unit).toBe('minutes'); |
| |
| }); |
| |
| xit('Should copy clusters', function() { |
| var processModel = { |
| process: { |
| clusters: {cluster: [{_name: 'ClusterOne', |
| validity: { |
| _start: '2014-02-28T01:20Z', |
| _end: '2016-03-31T04:30Z' |
| } |
| }]} |
| } |
| }; |
| |
| var process = serializer.preDeserialize(processModel, 'process'); |
| |
| expect(process.clusters[0].validity.start.date).toEqual(newUtcDate(2014, 2, 28)); |
| expect(process.clusters[0].validity.start.time).toEqual(newUtcTime(1, 20)); |
| expect(process.clusters[0].validity.end.date).toEqual(newUtcDate(2016, 3, 31)); |
| expect(process.clusters[0].validity.end.time).toEqual(newUtcTime(4, 30)); |
| |
| }); |
| |
| it('Should copy inputs', function() { |
| var processModel = { |
| process: { |
| inputs: {input: [ |
| {_name: 'input', _feed: 'rawEmailFeed', _start: 'now(0,0)', _end: 'now(0,0)' } |
| ]} |
| } |
| }; |
| |
| var process = serializer.preDeserialize(processModel, 'process'); |
| |
| expect(process.inputs[0].name).toEqual('input'); |
| expect(process.inputs[0].feed).toEqual('rawEmailFeed'); |
| expect(process.inputs[0].start).toEqual('now(0,0)'); |
| expect(process.inputs[0].end).toEqual('now(0,0)'); |
| }); |
| |
| it('Should copy outputs', function() { |
| var processModel = { |
| process: { |
| outputs: {output: [ |
| {_name: 'output', _feed: 'cleansedEmailFeed', _instance: 'now(0,0)' } |
| ]} |
| } |
| }; |
| |
| var process = serializer.preDeserialize(processModel, 'process'); |
| |
| expect(process.outputs[0].name).toEqual('output'); |
| expect(process.outputs[0].feed).toEqual('cleansedEmailFeed'); |
| expect(process.outputs[0].outputInstance).toEqual('now(0,0)'); |
| }); |
| |
| }); |
| |
| describe('serialize process into xml', function() { |
| |
| it('Should transform the basic properties', function () { |
| var process = { |
| name: 'ProcessName' |
| }; |
| |
| var xml = serializer.serialize(process, 'process'); |
| |
| expect(xml).toBe( |
| "<process xmlns='uri:falcon:process:0.1' name='ProcessName'/>" |
| ); |
| }); |
| |
| it('Should transform tags properly', function () { |
| var process = {name: 'ProcessName', |
| tags: [{key: 'key1', value: 'value1'}, {key: 'key2', value: 'value2'}, {key: null, value: 'value3'}] |
| }; |
| |
| var xml = serializer.serialize(process, 'process'); |
| |
| expect(xml).toBe( |
| "<process xmlns='uri:falcon:process:0.1' name='ProcessName'>" + |
| "<tags>key1=value1,key2=value2</tags>" + |
| "</process>" |
| ); |
| }); |
| |
| it('Should transform workflow properly', function () { |
| var process = {name: 'ProcessName', |
| workflow: { |
| name: 'emailCleanseWorkflow', |
| engine: 'pig', |
| version: '5.0', |
| path: '/user/ambari-qa/falcon/demo/apps/pig/id.pig' |
| } |
| }; |
| |
| var xml = serializer.serialize(process, 'process'); |
| |
| expect(xml).toBe( |
| "<process xmlns='uri:falcon:process:0.1' name='ProcessName'>" + |
| "<workflow name='emailCleanseWorkflow' version='5.0' engine='pig' path='/user/ambari-qa/falcon/demo/apps/pig/id.pig'/>" + |
| "</process>" |
| ); |
| }); |
| |
| it('Should transform timezone', function () { |
| var process = {name: 'ProcessName', |
| timezone: 'GMT+1:00' |
| }; |
| |
| var xml = serializer.serialize(process, 'process'); |
| |
| expect(xml).toBe( |
| "<process xmlns='uri:falcon:process:0.1' name='ProcessName'>" + |
| "<timezone>GMT+1:00</timezone>" + |
| "</process>" |
| ); |
| |
| }); |
| |
| it('Should transform frequency properly', function () { |
| var process = {name: 'ProcessName', |
| frequency: {quantity: 4, unit: 'weeks'} |
| }; |
| |
| var xml = serializer.serialize(process, 'process'); |
| |
| expect(xml).toBe( |
| "<process xmlns='uri:falcon:process:0.1' name='ProcessName'>" + |
| "<frequency>weeks(4)</frequency>" + |
| "</process>" |
| ); |
| |
| }); |
| |
| it('Should transform parallel properly', function () { |
| var process = {name: 'ProcessName', |
| parallel: 11 |
| }; |
| |
| var xml = serializer.serialize(process, 'process'); |
| |
| expect(xml).toBe( |
| "<process xmlns='uri:falcon:process:0.1' name='ProcessName'>" + |
| "<parallel>11</parallel>" + |
| "</process>" |
| ); |
| |
| }); |
| |
| it('Should transform order properly', function () { |
| var process = {name: 'ProcessName', |
| order: 'LIFO' |
| }; |
| |
| var xml = serializer.serialize(process, 'process'); |
| |
| expect(xml).toBe( |
| "<process xmlns='uri:falcon:process:0.1' name='ProcessName'>" + |
| "<order>LIFO</order>" + |
| "</process>" |
| ); |
| |
| }); |
| |
| it('Should transform retry properly', function () { |
| var process = {name: 'ProcessName', |
| retry: { |
| policy: 'periodic', |
| delay: {quantity: 15, unit: 'minutes'}, |
| attempts: 3 |
| } |
| }; |
| |
| var xml = serializer.serialize(process, 'process'); |
| |
| expect(xml).toBe( |
| "<process xmlns='uri:falcon:process:0.1' name='ProcessName'>" + |
| "<retry policy='periodic' delay='minutes(15)' attempts='3'/>" + |
| "</process>" |
| ); |
| }); |
| |
| xit('Should transform clusters', function () { |
| |
| var process = {name: 'ProcessName', |
| clusters: [ |
| { |
| name: 'primaryCluster', |
| validity: {start: {date: newUtcDate(2014, 2, 28), time: newUtcTime(0,0)}, end: {date: newUtcDate(2016, 4, 1), time: newUtcTime(0,0)}} |
| }, |
| { |
| name: 'secondaryCluster', |
| validity: {start: {date: newUtcDate(2015, 2, 28), time: newUtcTime(0,0)}, end: {date: newUtcDate(2017, 4, 1), time: newUtcTime(0,0)}} |
| } |
| ] |
| }; |
| |
| var xml = serializer.serialize(process, 'process'); |
| |
| expect(xml).toBe( |
| "<process xmlns='uri:falcon:process:0.1' name='ProcessName'>" + |
| "<clusters>" + |
| "<cluster name='primaryCluster'>" + |
| "<validity start='2014-02-28T00:00Z' end='2016-04-01T00:00Z'/>" + |
| "</cluster>" + |
| "<cluster name='secondaryCluster'>" + |
| "<validity start='2015-02-28T00:00Z' end='2017-04-01T00:00Z'/>" + |
| "</cluster>" + |
| "</clusters>" + |
| "</process>" |
| ); |
| |
| }); |
| |
| it('Should transform inputs', function () { |
| |
| var process = {name: 'ProcessName', |
| inputs: [ |
| { name: 'input', feed: 'rawEmailFeed', start: 'now(0,0)', end: 'now(0,0)' } |
| ] |
| }; |
| |
| var xml = serializer.serialize(process, 'process'); |
| |
| expect(xml).toBe( |
| "<process xmlns='uri:falcon:process:0.1' name='ProcessName'>" + |
| "<inputs>" + |
| "<input name='input' feed='rawEmailFeed' start='now(0,0)' end='now(0,0)'>" + |
| "</input>" + |
| "</inputs>" + |
| "</process>" |
| ); |
| |
| }); |
| |
| it('Should transform outputs', function () { |
| |
| var process = {name: 'ProcessName', |
| outputs: [ |
| { name: 'output', feed: 'cleansedEmailFeed', outputInstance: 'now(0,0)'} |
| ] |
| }; |
| |
| var xml = serializer.serialize(process, 'process'); |
| |
| expect(xml).toBe( |
| "<process xmlns='uri:falcon:process:0.1' name='ProcessName'>" + |
| "<outputs>" + |
| "<output name='output' feed='cleansedEmailFeed' instance='now(0,0)'>" + |
| "</output>" + |
| "</outputs>" + |
| "</process>" |
| ); |
| |
| }); |
| |
| }); |
| |
| function newUtcDate(year, month, day) { |
| return new Date(Date.UTC(year, month, day)) |
| } |
| |
| function newUtcTime(hours, minutes) { |
| return new Date(Date.UTC(1900, 1, 1, hours, minutes, 0)); |
| } |
| |
| }); |
| })(); |