http://git-wip-us.apache.org/repos/asf/cloudstack/blob/233445ed/plugins/network-elements/globodns/test/com/globo/globodns/cloudstack/resource/GloboDnsResourceTest.java
----------------------------------------------------------------------
diff --git 
a/plugins/network-elements/globodns/test/com/globo/globodns/cloudstack/resource/GloboDnsResourceTest.java
 
b/plugins/network-elements/globodns/test/com/globo/globodns/cloudstack/resource/GloboDnsResourceTest.java
new file mode 100644
index 0000000..0fd0e11
--- /dev/null
+++ 
b/plugins/network-elements/globodns/test/com/globo/globodns/cloudstack/resource/GloboDnsResourceTest.java
@@ -0,0 +1,447 @@
+package com.globo.globodns.cloudstack.resource;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.inOrder;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.any;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InOrder;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.annotation.DirtiesContext.ClassMode;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.support.AnnotationConfigContextLoader;
+
+import com.cloud.agent.api.Answer;
+import com.globo.globodns.client.GloboDns;
+import com.globo.globodns.client.api.DomainAPI;
+import com.globo.globodns.client.api.ExportAPI;
+import com.globo.globodns.client.api.RecordAPI;
+import com.globo.globodns.client.model.Domain;
+import com.globo.globodns.client.model.Record;
+import com.globo.globodns.cloudstack.commands.CreateOrUpdateDomainCommand;
+import 
com.globo.globodns.cloudstack.commands.CreateOrUpdateRecordAndReverseCommand;
+import com.globo.globodns.cloudstack.commands.RemoveDomainCommand;
+import com.globo.globodns.cloudstack.commands.RemoveRecordCommand;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(loader = AnnotationConfigContextLoader.class)
+@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
+public class GloboDnsResourceTest {
+
+    private GloboDnsResource _globoDnsResource;
+
+    private GloboDns _globoDnsApi;
+    private DomainAPI _domainApi;
+    private RecordAPI _recordApi;
+    private ExportAPI _exportApi;
+
+    private static final Long TEMPLATE_ID = 1l;
+
+    private static long sequenceId = 10l;
+
+    @Before
+    public void setUp() throws Exception {
+        // ComponentContext.initComponentsLifeCycle();
+
+        String name = "GloboDNS";
+        Map<String, Object> params = new HashMap<String, Object>();
+        params.put("zoneId", "1");
+        params.put("guid", "globodns");
+        params.put("name", name);
+        params.put("url", "http://example.com";);
+        params.put("username", "username");
+        params.put("password", "password");
+
+        _globoDnsResource = new GloboDnsResource();
+        _globoDnsResource.configure(name, params);
+
+        _globoDnsApi = spy(_globoDnsResource._globoDns);
+        _globoDnsResource._globoDns = _globoDnsApi;
+
+        _domainApi = mock(DomainAPI.class);
+        when(_globoDnsApi.getDomainAPI()).thenReturn(_domainApi);
+
+        _recordApi = mock(RecordAPI.class);
+        when(_globoDnsApi.getRecordAPI()).thenReturn(_recordApi);
+
+        _exportApi = mock(ExportAPI.class);
+        when(_globoDnsApi.getExportAPI()).thenReturn(_exportApi);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+    }
+
+    ///////////////////////
+    // Auxiliary Methods //
+    ///////////////////////
+
+    private Domain generateFakeDomain(String domainName, boolean reverse) {
+        Domain domain = new Domain();
+        domain.getDomainAttributes().setId(sequenceId++);
+        domain.getDomainAttributes().setName(domainName);
+        List<Domain> domainList = new ArrayList<Domain>();
+        domainList.add(domain);
+        if (reverse) {
+            
when(_domainApi.listReverseByQuery(eq(domainName))).thenReturn(domainList);
+        } else {
+            
when(_domainApi.listByQuery(eq(domainName))).thenReturn(domainList);
+        }
+        return domain;
+    }
+
+    private Record generateFakeRecord(Domain domain, String recordName, String 
recordContent, boolean reverse) {
+        Record record = new Record();
+        if (reverse) {
+            record.getTypePTRRecordAttributes().setName(recordName);
+            record.getTypePTRRecordAttributes().setContent(recordContent);
+            record.getTypePTRRecordAttributes().setDomainId(domain.getId());
+            record.getTypePTRRecordAttributes().setId(sequenceId++);
+        } else {
+            record.getTypeARecordAttributes().setName(recordName);
+            record.getTypeARecordAttributes().setContent(recordContent);
+            record.getTypeARecordAttributes().setDomainId(domain.getId());
+            record.getTypeARecordAttributes().setId(sequenceId++);
+        }
+        List<Record> recordList = new ArrayList<Record>();
+        recordList.add(record);
+        when(_recordApi.listByQuery(eq(domain.getId()), 
eq(recordName))).thenReturn(recordList);
+        return record;
+    }
+
+    /////////////////////////
+    // Create Domain tests //
+    /////////////////////////
+
+    @Test
+    public void 
testCreateDomainWithSuccessWhenDomainDoesntExistAndOverrideIsTrue() throws 
Exception {
+        String domainName = "domain.name.com";
+
+        Domain domain = new Domain();
+        domain.getDomainAttributes().setId(sequenceId++);
+        domain.getDomainAttributes().setName(domainName);
+
+        when(_domainApi.createDomain(eq(domain.getName()), eq(TEMPLATE_ID), 
eq("M"))).thenReturn(domain);
+
+        Answer answer = _globoDnsResource.execute(new 
CreateOrUpdateDomainCommand(domainName, TEMPLATE_ID));
+        assertNotNull(answer);
+        assertEquals(true, answer.getResult());
+        verify(_exportApi, times(1)).scheduleExport();
+    }
+
+    @Test
+    @SuppressWarnings("unused")
+    public void 
testCreateDomainWillSucceedWhenDomainAlreadyExistsAndOverrideIsFalse() throws 
Exception {
+        String domainName = "domain.name.com";
+
+        Domain domain = generateFakeDomain(domainName, false);
+
+        Answer answer = _globoDnsResource.execute(new 
CreateOrUpdateDomainCommand(domainName, TEMPLATE_ID));
+        assertNotNull(answer);
+        assertEquals(true, answer.getResult());
+    }
+
+    /////////////////////////
+    // Create Record tests //
+    /////////////////////////
+
+    @Test
+    @SuppressWarnings("unused")
+    public void 
testCreateRecordAndReverseWithSuccessWhenDomainExistsAndRecordDoesntExistAndOverrideIsTrue()
 throws Exception {
+        String recordName = "recordname";
+        String recordIp = "40.30.20.10";
+        String domainName = "domain.name.com";
+        String reverseDomainName = "20.30.40.in-addr.arpa";
+        String reverseRecordName = "10";
+        String reverseRecordContent = recordName + "." + domainName;
+
+        Domain domain = generateFakeDomain(domainName, false);
+        Record record = generateFakeRecord(domain, recordName, recordIp, 
false);
+        Domain reverseDomain = generateFakeDomain(reverseDomainName, true);
+        Record reverseRecord = generateFakeRecord(reverseDomain, 
reverseRecordName, reverseRecordContent, true);
+
+        when(_recordApi.createRecord(eq(domain.getId()), eq(recordName), 
eq(recordIp), eq("A"))).thenReturn(record);
+        when(_recordApi.createRecord(eq(reverseDomain.getId()), 
eq(reverseRecordName), eq(reverseRecordContent), eq("PTR"))).thenReturn(record);
+
+        Answer answer = _globoDnsResource.execute(new 
CreateOrUpdateRecordAndReverseCommand(recordName, recordIp, domainName, 
TEMPLATE_ID, true));
+        assertNotNull(answer);
+        assertEquals(true, answer.getResult());
+        verify(_exportApi, times(1)).scheduleExport();
+    }
+
+    @Test
+    @SuppressWarnings("unused")
+    public void 
testCreateRecordAndReverseWillFailWhenRecordAlreadyExistsAndOverrideIsFalse() 
throws Exception {
+        String recordName = "recordname";
+        String newIp = "40.30.20.10";
+        String oldIp = "50.40.30.20";
+        String domainName = "domain.name.com";
+
+        Domain domain = generateFakeDomain(domainName, false);
+        Record record = generateFakeRecord(domain, recordName, oldIp, false);
+
+        Answer answer = _globoDnsResource.execute(new 
CreateOrUpdateRecordAndReverseCommand(recordName, newIp, domainName, 
TEMPLATE_ID, false));
+        assertNotNull(answer);
+        assertEquals(false, answer.getResult());
+    }
+
+    @Test
+    @SuppressWarnings("unused")
+    public void 
testCreateRecordAndReverseWillFailWhenReverseRecordAlreadyExistsAndOverrideIsFalse()
 throws Exception {
+        String recordName = "recordname";
+        String recordIp = "40.30.20.10";
+        String domainName = "domain.name.com";
+        String reverseDomainName = "20.30.40.in-addr.arpa";
+        String reverseRecordName = "10";
+
+        Domain domain = generateFakeDomain(domainName, false);
+        Record record = generateFakeRecord(domain, recordName, recordIp, 
false);
+        Domain reverseDomain = generateFakeDomain(reverseDomainName, true);
+        Record reverseRecord = generateFakeRecord(reverseDomain, 
reverseRecordName, "X", true);
+
+        Answer answer = _globoDnsResource.execute(new 
CreateOrUpdateRecordAndReverseCommand(recordName, recordIp, domainName, 
TEMPLATE_ID, false));
+        assertNotNull(answer);
+        assertEquals(false, answer.getResult());
+    }
+
+    @Test
+    public void testCreateRecordAndReverseWhenDomainDoesNotExist() throws 
Exception {
+        String recordName = "recordname";
+        String recordIp = "40.30.20.10";
+        String domainName = "domain.name.com";
+        String reverseDomainName = "20.30.40.in-addr.arpa";
+        String reverseRecordName = "10";
+        String reverseRecordContent = recordName + "." + domainName;
+
+        Domain domain = new Domain();
+        domain.getDomainAttributes().setId(sequenceId++);
+        Domain reverseDomain = new Domain();
+        reverseDomain.getDomainAttributes().setId(sequenceId++);
+
+        Record record = new Record();
+
+        when(_domainApi.listByQuery(domainName)).thenReturn(new 
ArrayList<Domain>());
+        when(_domainApi.createDomain(eq(domainName), eq(TEMPLATE_ID), 
eq("M"))).thenReturn(domain);
+        when(_recordApi.createRecord(eq(domain.getId()), eq(recordName), 
eq(recordIp), eq("A"))).thenReturn(record);
+        when(_domainApi.createReverseDomain(eq(reverseDomainName), 
eq(TEMPLATE_ID), eq("M"))).thenReturn(reverseDomain);
+        when(_recordApi.createRecord(eq(reverseDomain.getId()), 
eq(reverseRecordName), eq(reverseRecordContent), eq("PTR"))).thenReturn(record);
+
+        Answer answer = _globoDnsResource.execute(new 
CreateOrUpdateRecordAndReverseCommand(recordName, recordIp, domainName, 
TEMPLATE_ID, true));
+        assertNotNull(answer);
+        assertEquals(true, answer.getResult());
+        verify(_exportApi, times(1)).scheduleExport();
+    }
+
+    @Test
+    public void 
testCreateRecordAndReverseWhenDomainDoesNotExistAndOverrideIsFalse() throws 
Exception {
+        String recordName = "recordname";
+        String recordIp = "40.30.20.10";
+        String domainName = "domain.name.com";
+        String reverseDomainName = "20.30.40.in-addr.arpa";
+        String reverseRecordName = "10";
+        String reverseRecordContent = recordName + "." + domainName;
+
+        Domain domain = new Domain();
+        domain.getDomainAttributes().setId(sequenceId++);
+        Domain reverseDomain = new Domain();
+        reverseDomain.getDomainAttributes().setId(sequenceId++);
+
+        Record record = new Record();
+
+        when(_domainApi.listByQuery(domainName)).thenReturn(new 
ArrayList<Domain>());
+        when(_domainApi.createDomain(eq(domainName), eq(TEMPLATE_ID), 
eq("M"))).thenReturn(domain);
+        when(_recordApi.createRecord(eq(domain.getId()), eq(recordName), 
eq(recordIp), eq("A"))).thenReturn(record);
+        when(_domainApi.createReverseDomain(eq(reverseDomainName), 
eq(TEMPLATE_ID), eq("M"))).thenReturn(reverseDomain);
+        when(_recordApi.createRecord(eq(reverseDomain.getId()), 
eq(reverseRecordName), eq(reverseRecordContent), eq("PTR"))).thenReturn(record);
+
+        Answer answer = _globoDnsResource.execute(new 
CreateOrUpdateRecordAndReverseCommand(recordName, recordIp, domainName, 
TEMPLATE_ID, false));
+        assertNotNull(answer);
+        assertEquals(true, answer.getResult());
+        verify(_exportApi, times(1)).scheduleExport();
+    }
+
+    /////////////////////////
+    // Update Record tests //
+    /////////////////////////
+
+    @Test
+    public void testUpdateRecordAndReverseWhenDomainExistsAndOverrideIsTrue() 
throws Exception {
+        String recordName = "recordname";
+        String oldRecordIp = "40.30.20.10";
+        String newRecordIp = "50.40.30.20";
+        String domainName = "domain.name.com";
+        String reverseDomainName = "30.40.50.in-addr.arpa";
+        String reverseRecordName = "20";
+        String reverseRecordContent = recordName + "." + domainName;
+
+        Domain domain = generateFakeDomain(domainName, false);
+        Record record = generateFakeRecord(domain, recordName, oldRecordIp, 
false);
+        Domain reverseDomain = generateFakeDomain(reverseDomainName, true);
+        Record reverseRecord = generateFakeRecord(reverseDomain, 
reverseRecordName, "X", true);
+
+        Answer answer = _globoDnsResource.execute(new 
CreateOrUpdateRecordAndReverseCommand(recordName, newRecordIp, domainName, 
TEMPLATE_ID, true));
+
+        // ensure calls in sequence to ensure this call are the only ones.
+        InOrder inOrder = inOrder(_recordApi);
+        inOrder.verify(_recordApi, times(1)).updateRecord(eq(record.getId()), 
eq(domain.getId()), eq(recordName), eq(newRecordIp));
+        inOrder.verify(_recordApi, 
times(1)).updateRecord(eq(reverseRecord.getId()), eq(reverseDomain.getId()), 
eq(reverseRecordName), eq(reverseRecordContent));
+
+        assertNotNull(answer);
+        assertEquals(true, answer.getResult());
+        verify(_exportApi, times(1)).scheduleExport();
+    }
+
+    /////////////////////////
+    // Remove Record tests //
+    /////////////////////////
+
+    @Test
+    public void testRemoveRecordWhenRecordExists() throws Exception {
+        String recordName = "recordname";
+        String recordIp = "40.30.20.10";
+        String domainName = "domain.name.com";
+        String reverseDomainName = "20.30.40.in-addr.arpa";
+        String reverseRecordName = "10";
+        String reverseRecordContent = recordName + "." + domainName;
+
+        Domain domain = generateFakeDomain(domainName, false);
+        Record record = generateFakeRecord(domain, recordName, recordIp, 
false);
+        Domain reverseDomain = generateFakeDomain(reverseDomainName, true);
+        Record reverseRecord = generateFakeRecord(reverseDomain, 
reverseRecordName, reverseRecordContent, true);
+
+        Answer answer = _globoDnsResource.execute(new 
RemoveRecordCommand(recordName, recordIp, domainName, true));
+
+        assertNotNull(answer);
+        assertEquals(true, answer.getResult());
+        verify(_recordApi, times(1)).removeRecord(eq(record.getId()));
+        verify(_recordApi, times(1)).removeRecord(eq(reverseRecord.getId()));
+        verify(_exportApi, times(1)).scheduleExport();
+    }
+
+    @Test
+    public void 
testRemoveRecordWithSuccessAndReverseRecordNotRemovedWhenReverseRecordExistsWithDifferentValueAndOverrideIsFalse()
 throws Exception {
+        String recordName = "recordname";
+        String recordIp = "40.30.20.10";
+        String domainName = "domain.name.com";
+        String reverseDomainName = "20.30.40.in-addr.arpa";
+        String reverseRecordName = "10";
+
+        Domain domain = generateFakeDomain(domainName, false);
+        Record record = generateFakeRecord(domain, recordName, recordIp, 
false);
+        Domain reverseDomain = generateFakeDomain(reverseDomainName, true);
+        Record reverseRecord = generateFakeRecord(reverseDomain, 
reverseRecordName, "X", true);
+
+        Answer answer = _globoDnsResource.execute(new 
RemoveRecordCommand(recordName, recordIp, domainName, false));
+
+        assertEquals(true, answer.getResult());
+        verify(_recordApi, times(1)).removeRecord(eq(record.getId()));
+        verify(_recordApi, never()).removeRecord(eq(reverseRecord.getId()));
+        verify(_exportApi, times(1)).scheduleExport();
+    }
+
+    @Test
+    public void 
testRemoveReverseRecordButNotRemoveRecordWhenRecordExistsWithDifferentValueAndOverrideIsFalse()
 throws Exception {
+        String recordName = "recordname";
+        String recordIp = "40.30.20.10";
+        String domainName = "domain.name.com";
+        String reverseDomainName = "20.30.40.in-addr.arpa";
+        String reverseRecordName = "10";
+        String reverseRecordContent = recordName + "." + domainName;
+
+        Domain domain = generateFakeDomain(domainName, false);
+        Record record = generateFakeRecord(domain, recordName, "X", false);
+        Domain reverseDomain = generateFakeDomain(reverseDomainName, true);
+        Record reverseRecord = generateFakeRecord(reverseDomain, 
reverseRecordName, reverseRecordContent, true);
+
+        Answer answer = _globoDnsResource.execute(new 
RemoveRecordCommand(recordName, recordIp, domainName, false));
+
+        assertEquals(true, answer.getResult());
+        verify(_recordApi, never()).removeRecord(eq(record.getId()));
+        verify(_recordApi, times(1)).removeRecord(eq(reverseRecord.getId()));
+        verify(_exportApi, times(1)).scheduleExport();
+    }
+
+    /////////////////////////
+    // Remove Domain tests //
+    /////////////////////////
+
+    @Test
+    public void 
testRemoveDomainWithSuccessButDomainKeptWhenDomainExistsAndThereAreRecordsAndOverrideIsFalse()
 throws Exception {
+        String recordName = "recordname";
+        String recordIp = "40.30.20.10";
+        String domainName = "domain.name.com";
+
+        Domain domain = generateFakeDomain(domainName, false);
+        Record record = generateFakeRecord(domain, recordName, "X", false);
+        
when(_recordApi.listAll(domain.getId())).thenReturn(Arrays.asList(record));
+
+        Answer answer = _globoDnsResource.execute(new 
RemoveRecordCommand(recordName, recordIp, domainName, false));
+
+        assertEquals(true, answer.getResult());
+        verify(_domainApi, never()).removeDomain(any(Long.class));
+        verify(_exportApi, never()).scheduleExport();
+    }
+
+    @Test
+    public void 
testRemoveDomainWithSuccessWhenDomainExistsAndThereAreOnlyNSRecordsAndOverrideIsFalse()
 throws Exception {
+        String domainName = "domain.name.com";
+
+        Domain domain = generateFakeDomain(domainName, false);
+        List<Record> recordList = new ArrayList<Record>();
+        for (int i = 0; i < 10; i++) {
+            Record record = new Record();
+            record.getTypeNSRecordAttributes().setDomainId(domain.getId());
+            record.getTypeNSRecordAttributes().setId(sequenceId++);
+            record.getTypeNSRecordAttributes().setType("NS");
+            recordList.add(record);
+        }
+        when(_recordApi.listAll(domain.getId())).thenReturn(recordList);
+
+        Answer answer = _globoDnsResource.execute(new 
RemoveDomainCommand(domainName, false));
+
+        assertEquals(true, answer.getResult());
+        verify(_domainApi, times(1)).removeDomain(eq(domain.getId()));
+        verify(_exportApi, times(1)).scheduleExport();
+    }
+
+    @Test
+    public void 
testRemoveDomainWithSuccessWhenDomainExistsAndThereAreRecordsAndOverrideIsTrue()
 throws Exception {
+        String domainName = "domain.name.com";
+
+        Domain domain = generateFakeDomain(domainName, false);
+        List<Record> recordList = new ArrayList<Record>();
+        for (int i = 0; i < 10; i++) {
+            Record record = new Record();
+            record.getTypeNSRecordAttributes().setDomainId(domain.getId());
+            record.getTypeNSRecordAttributes().setId(sequenceId++);
+            record.getTypeNSRecordAttributes().setType(new String[] {"A", 
"NS", "PTR"}[i % 3]);
+            recordList.add(record);
+        }
+        when(_recordApi.listAll(domain.getId())).thenReturn(recordList);
+
+        Answer answer = _globoDnsResource.execute(new 
RemoveDomainCommand(domainName, true));
+
+        assertEquals(true, answer.getResult());
+        verify(_domainApi, times(1)).removeDomain(eq(domain.getId()));
+        verify(_exportApi, times(1)).scheduleExport();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/233445ed/plugins/network-elements/globodns/test/resources/db.properties
----------------------------------------------------------------------
diff --git a/plugins/network-elements/globodns/test/resources/db.properties 
b/plugins/network-elements/globodns/test/resources/db.properties
new file mode 100644
index 0000000..0dd35f6
--- /dev/null
+++ b/plugins/network-elements/globodns/test/resources/db.properties
@@ -0,0 +1,75 @@
+# 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.
+
+
+# management server clustering parameters, change cluster.node.IP to the 
machine IP address
+# in which the management server(Tomcat) is running
+cluster.node.IP=127.0.0.1
+cluster.servlet.port=9090
+region.id=1
+
+# CloudStack database settings
+db.cloud.username=cloud
+db.cloud.password=cloud
+db.root.password=
+db.cloud.host=localhost
+db.cloud.port=3306
+db.cloud.name=cloud
+
+# CloudStack database tuning parameters
+db.cloud.maxActive=250
+db.cloud.maxIdle=30
+db.cloud.maxWait=10000
+db.cloud.autoReconnect=true
+db.cloud.validationQuery=SELECT 1
+db.cloud.testOnBorrow=true
+db.cloud.testWhileIdle=true
+db.cloud.timeBetweenEvictionRunsMillis=40000
+db.cloud.minEvictableIdleTimeMillis=240000
+db.cloud.poolPreparedStatements=false
+db.cloud.url.params=prepStmtCacheSize=517&cachePrepStmts=true&prepStmtCacheSqlLimit=4096
+
+# usage database settings
+db.usage.username=cloud
+db.usage.password=cloud
+db.usage.host=localhost
+db.usage.port=3306
+db.usage.name=cloud_usage
+
+# usage database tuning parameters
+db.usage.maxActive=100
+db.usage.maxIdle=30
+db.usage.maxWait=10000
+db.usage.autoReconnect=true
+
+# awsapi database settings
+db.awsapi.username=cloud
+db.awsapi.password=cloud
+db.awsapi.host=localhost
+db.awsapi.port=3306
+db.awsapi.name=cloudbridge
+
+# Simulator database settings
+db.simulator.username=cloud
+db.simulator.password=cloud
+db.simulator.host=localhost
+db.simulator.port=3306
+db.simulator.name=simulator
+db.simulator.maxActive=250
+db.simulator.maxIdle=30
+db.simulator.maxWait=10000
+db.simulator.autoReconnect=true

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/233445ed/plugins/network-elements/globodns/test/resources/log4j.properties
----------------------------------------------------------------------
diff --git a/plugins/network-elements/globodns/test/resources/log4j.properties 
b/plugins/network-elements/globodns/test/resources/log4j.properties
new file mode 100644
index 0000000..32322a0
--- /dev/null
+++ b/plugins/network-elements/globodns/test/resources/log4j.properties
@@ -0,0 +1,16 @@
+# Define the root logger with appender file
+#log = /var/log/log4j
+#log4j.rootLogger = DEBUG, FILE
+log4j.rootLogger = DEBUG, stdout
+
+# File appender
+#log4j.appender.FILE=org.apache.log4j.FileAppender
+#log4j.appender.FILE.File=${log}/log.out
+#log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
+#log4j.appender.FILE.layout.conversionPattern=%m%n
+
+# Stdout appender
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.Target=System.out
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p 
%c{1}:%L - %m%n

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/233445ed/plugins/pom.xml
----------------------------------------------------------------------
diff --git a/plugins/pom.xml b/plugins/pom.xml
index 0b1b62d..b190ee5 100755
--- a/plugins/pom.xml
+++ b/plugins/pom.xml
@@ -88,6 +88,7 @@
     <module>alert-handlers/syslog-alerts</module>
     <module>network-elements/internal-loadbalancer</module>
     <module>network-elements/vxlan</module>
+    <module>network-elements/globodns</module>
   </modules>
 
   <dependencies>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/233445ed/ui/scripts/system.js
----------------------------------------------------------------------
diff --git a/ui/scripts/system.js b/ui/scripts/system.js
index fe51acb..fdd0f9a 100644
--- a/ui/scripts/system.js
+++ b/ui/scripts/system.js
@@ -7424,7 +7424,211 @@
                                 }
                             }
                         }
-                    }                    
+                    },
+
+                    // GloboDns provider detail view
+                    GloboDns: {
+                        isMaximized: true,
+                        type: 'detailView',
+                        id: 'globoDnsProvider',
+                        label: 'GloboDNS',
+                        tabs: {
+                            details: {
+                                title: 'label.details',
+                                fields: [{
+                                    name: {
+                                        label: 'label.name'
+                                    }
+                                }, {
+                                    state: {
+                                        label: 'label.state'
+                                    }
+                                }],
+                                dataProvider: function(args) {
+                                    refreshNspData("GloboDns");
+                                    var providerObj;
+                                    $(nspHardcodingArray).each(function() {
+                                        if (this.id == "GloboDns") {
+                                            providerObj = this;
+                                            return false; //break each loop
+                                        }
+                                    });
+                                    args.response.success({
+                                        data: providerObj,
+                                        actionFilter: 
networkProviderActionFilter('GloboDns')
+                                    });
+                                }
+                            },
+                        },
+                        actions: {
+                            add: {
+                                label: 'GloboDNS Configuration',
+                                createForm: {
+                                    title: 'GloboDNS Configuration',
+                                    preFilter: function(args) {},
+                                    fields: {
+                                        username: {
+                                            label: 'Username',
+                                            validation: {
+                                                required: true
+                                            }
+                                        },
+                                        password: {
+                                            label: 'Password',
+                                            isPassword: true,
+                                            validation: {
+                                                required: true
+                                            }
+                                        },
+                                        url: {
+                                            label: 'URL',
+                                            validation: {
+                                                required: true
+                                            }
+                                        }
+                                    }
+                                },
+                                action: function(args) {
+                                    if (nspMap["GloboDns"] == null) {
+                                        $.ajax({
+                                            url: 
createURL("addNetworkServiceProvider&name=GloboDns&physicalnetworkid=" + 
selectedPhysicalNetworkObj.id),
+                                            dataType: "json",
+                                            async: true,
+                                            success: function(json) {
+                                                var jobId = 
json.addnetworkserviceproviderresponse.jobid;
+                                                var 
addGloboDnsProviderIntervalID = setInterval(function() {
+                                                    $.ajax({
+                                                        url: 
createURL("queryAsyncJobResult&jobId=" + jobId),
+                                                        dataType: "json",
+                                                        success: 
function(json) {
+                                                            var result = 
json.queryasyncjobresultresponse;
+                                                            if 
(result.jobstatus == 0) {
+                                                                return; //Job 
has not completed
+                                                            } else {
+                                                                
clearInterval(addGloboDnsProviderIntervalID);
+                                                                if 
(result.jobstatus == 1) {
+                                                                    
nspMap["GloboDns"] = 
json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
+                                                                    
addGloboDnsHost(args, selectedPhysicalNetworkObj, "addGloboDnsHost", 
"addglobodnshostresponse");
+                                                                } else if 
(result.jobstatus == 2) {
+                                                                    
alert("addNetworkServiceProvider&name=GloboDns failed. Error: " + 
_s(result.jobresult.errortext));
+                                                                }
+                                                            }
+                                                        },
+                                                        error: 
function(XMLHttpResponse) {
+                                                            var errorMsg = 
parseXMLHttpResponse(XMLHttpResponse);
+                                                            
alert("addNetworkServiceProvider&name=GloboDns failed. Error: " + errorMsg);
+                                                        }
+                                                    });
+                                                }, 
g_queryAsyncJobResultInterval);
+                                            }
+                                        });
+                                    } else {
+                                        addGloboDnsHost(args, 
selectedPhysicalNetworkObj, "addGloboDnsHost", "addglobodnshostresponse");
+                                    }
+                                },
+                                messages: {
+                                    notification: function(args) {
+                                        return 'Add GloboDNS';
+                                    }
+                                },
+                                notification: {
+                                    poll: pollAsyncJobResult
+                                }
+                            },
+                            enable: {
+                                label: 'label.enable.provider',
+                                action: function(args) {
+                                    $.ajax({
+                                        url: 
createURL("updateNetworkServiceProvider&id=" + nspMap["GloboDns"].id + 
"&state=Enabled"),
+                                        dataType: "json",
+                                        success: function(json) {
+                                            var jid = 
json.updatenetworkserviceproviderresponse.jobid;
+                                            args.response.success({
+                                                _custom: {
+                                                    jobId: jid,
+                                                    getUpdatedItem: 
function(json) {
+                                                        
$(window).trigger('cloudStack.fullRefresh');
+                                                    }
+                                                }
+                                            });
+                                        }
+                                    });
+                                },
+                                messages: {
+                                    confirm: function(args) {
+                                        return 
'message.confirm.enable.provider';
+                                    },
+                                    notification: function() {
+                                        return 'label.enable.provider';
+                                    }
+                                },
+                                notification: {
+                                    poll: pollAsyncJobResult
+                                }
+                            },
+                            disable: {
+                                label: 'label.disable.provider',
+                                action: function(args) {
+                                    $.ajax({
+                                        url: 
createURL("updateNetworkServiceProvider&id=" + nspMap["GloboDns"].id + 
"&state=Disabled"),
+                                        dataType: "json",
+                                        success: function(json) {
+                                            var jid = 
json.updatenetworkserviceproviderresponse.jobid;
+                                            args.response.success({
+                                                _custom: {
+                                                    jobId: jid,
+                                                    getUpdatedItem: 
function(json) {
+                                                        
$(window).trigger('cloudStack.fullRefresh');
+                                                    }
+                                                }
+                                            });
+                                        }
+                                    });
+                                },
+                                messages: {
+                                    confirm: function(args) {
+                                        return 
'message.confirm.disable.provider';
+                                    },
+                                    notification: function() {
+                                        return 'label.disable.provider';
+                                    }
+                                },
+                                notification: {
+                                    poll: pollAsyncJobResult
+                                }
+                            },
+                            destroy: {
+                                label: 'label.shutdown.provider',
+                                action: function(args) {
+                                    $.ajax({
+                                        url: 
createURL("deleteNetworkServiceProvider&id=" + nspMap["GloboDns"].id),
+                                        dataType: "json",
+                                        success: function(json) {
+                                            var jid = 
json.deletenetworkserviceproviderresponse.jobid;
+                                            args.response.success({
+                                                _custom: {
+                                                    jobId: jid
+                                                }
+                                            });
+
+                                            
$(window).trigger('cloudStack.fullRefresh');
+                                        }
+                                    });
+                                },
+                                messages: {
+                                    confirm: function(args) {
+                                        return 
'message.confirm.shutdown.provider';
+                                    },
+                                    notification: function(args) {
+                                        return 'label.shutdown.provider';
+                                    }
+                                },
+                                notification: {
+                                    poll: pollAsyncJobResult
+                                }
+                            }
+                        }
+                    }
                 }
             }
         },
@@ -19809,7 +20013,30 @@
                 });
             }
         });
-    }    
+    }
+
+    function addGloboDnsHost(args, physicalNetworkObj, apiCmd, apiCmdRes) {
+        var array1 = [];
+        array1.push("&physicalnetworkid=" + physicalNetworkObj.id);
+        array1.push("&username=" + todb(args.data.username));
+        array1.push("&password=" + todb(args.data.password));
+        array1.push("&url=" + todb(args.data.url));
+
+        $.ajax({
+            url: createURL(apiCmd + array1.join("")),
+            dataType: "json",
+            type: "POST",
+            success: function(json) {
+                var jid = json[apiCmdRes].jobid;
+                args.response.success({
+                    _custom: {
+                        jobId: jid,
+                    }
+                });
+            }
+        });
+    }
+
 
     var afterCreateZonePhysicalNetworkTrafficTypes = function (args, 
newZoneObj, newPhysicalnetwork) {
                 $.ajax({
@@ -20495,6 +20722,9 @@
                             case "NuageVsp":
                             nspMap["nuageVsp"] = items[i];
                             break;
+                            case "GloboDns":
+                                nspMap["GloboDns"] = items[i];
+                                break;
                         }
                     }
                 }
@@ -20598,6 +20828,11 @@
                 name: 'Palo Alto',
                 state: nspMap.pa ? nspMap.pa.state: 'Disabled'
             });
+            nspHardcodingArray.push({
+                id: 'GloboDns',
+                name: 'GloboDNS',
+                state: nspMap.GloboDns ? nspMap.GloboDns.state : 'Disabled'
+            });
         }
         
         if ($.grep(nspHardcodingArray, function(e) { return e.id == 'Ovs'; 
}).length == 0 ) {

Reply via email to