From 70f743a70a3b7eb5513440df3c5f4e4c50f5f4db Mon Sep 17 00:00:00 2001 From: "Ruben S. Montero" Date: Tue, 17 Oct 2017 13:12:19 +0200 Subject: [PATCH] Removed tests from repository (cherry picked from commit 3355effd151ef58527874eb93725c7d9c1b86cc9) --- src/oca/java/lib/LICENSE.txt | 202 ---- src/oca/java/lib/NOTICE.txt | 5 - src/oca/java/lib/ws-commons-util-1.0.2.jar | Bin 34407 -> 0 bytes src/oca/java/lib/xmlrpc-client-3.1.2.jar | Bin 56965 -> 0 bytes src/oca/java/lib/xmlrpc-common-3.1.2.jar | Bin 108656 -> 0 bytes src/oca/java/test/AclTest.java | 306 ------ src/oca/java/test/DocumentTest.java | 163 ---- src/oca/java/test/GenericObjA.java | 25 - src/oca/java/test/GenericObjAPool.java | 53 - src/oca/java/test/GenericObjB.java | 25 - src/oca/java/test/GenericObjBPool.java | 53 - src/oca/java/test/GroupTest.java | 306 ------ src/oca/java/test/HostTest.java | 217 ----- src/oca/java/test/ImageTest.java | 260 ----- src/oca/java/test/SecurityGroupTest.java | 266 ----- src/oca/java/test/SessionTest.java | 87 -- src/oca/java/test/TemplateTest.java | 304 ------ src/oca/java/test/UserTest.java | 233 ----- src/oca/java/test/VMGroupTest.java | 266 ----- src/oca/java/test/VdcTest.java | 194 ---- src/oca/java/test/VirtualMachineTest.java | 361 ------- src/oca/java/test/VirtualNetworkTest.java | 234 ----- src/oca/java/test/VirtualRouterTest.java | 294 ------ src/oca/java/test/all_tests.sh | 89 -- src/oca/java/test/oned.conf | 1011 -------------------- src/oca/java/test/test.sh | 66 -- 26 files changed, 5020 deletions(-) delete mode 100644 src/oca/java/lib/LICENSE.txt delete mode 100644 src/oca/java/lib/NOTICE.txt delete mode 100644 src/oca/java/lib/ws-commons-util-1.0.2.jar delete mode 100644 src/oca/java/lib/xmlrpc-client-3.1.2.jar delete mode 100644 src/oca/java/lib/xmlrpc-common-3.1.2.jar delete mode 100644 src/oca/java/test/AclTest.java delete mode 100644 src/oca/java/test/DocumentTest.java delete mode 100644 src/oca/java/test/GenericObjA.java delete mode 100644 src/oca/java/test/GenericObjAPool.java delete mode 100644 src/oca/java/test/GenericObjB.java delete mode 100644 src/oca/java/test/GenericObjBPool.java delete mode 100644 src/oca/java/test/GroupTest.java delete mode 100644 src/oca/java/test/HostTest.java delete mode 100644 src/oca/java/test/ImageTest.java delete mode 100644 src/oca/java/test/SecurityGroupTest.java delete mode 100644 src/oca/java/test/SessionTest.java delete mode 100644 src/oca/java/test/TemplateTest.java delete mode 100644 src/oca/java/test/UserTest.java delete mode 100644 src/oca/java/test/VMGroupTest.java delete mode 100644 src/oca/java/test/VdcTest.java delete mode 100644 src/oca/java/test/VirtualMachineTest.java delete mode 100644 src/oca/java/test/VirtualNetworkTest.java delete mode 100644 src/oca/java/test/VirtualRouterTest.java delete mode 100755 src/oca/java/test/all_tests.sh delete mode 100644 src/oca/java/test/oned.conf delete mode 100755 src/oca/java/test/test.sh diff --git a/src/oca/java/lib/LICENSE.txt b/src/oca/java/lib/LICENSE.txt deleted file mode 100644 index d645695673..0000000000 --- a/src/oca/java/lib/LICENSE.txt +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/src/oca/java/lib/NOTICE.txt b/src/oca/java/lib/NOTICE.txt deleted file mode 100644 index 3a6553bd7f..0000000000 --- a/src/oca/java/lib/NOTICE.txt +++ /dev/null @@ -1,5 +0,0 @@ -Apache XML-RPC -Copyright 1999-2009 The Apache Software Foundation - -This product includes software developed at -The Apache Software Foundation (http://www.apache.org/). diff --git a/src/oca/java/lib/ws-commons-util-1.0.2.jar b/src/oca/java/lib/ws-commons-util-1.0.2.jar deleted file mode 100644 index 3fc364e7f605b580850530c281998a1f861cc0c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34407 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 wRPetqnrsVY#p;GbnM6LAUy!%dw31FtFwzW@LL diff --git a/src/oca/java/test/AclTest.java b/src/oca/java/test/AclTest.java deleted file mode 100644 index 5fb4e978ac..0000000000 --- a/src/oca/java/test/AclTest.java +++ /dev/null @@ -1,306 +0,0 @@ -/******************************************************************************* - * Copyright 2002-2017, OpenNebula Project, OpenNebula Systems - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - ******************************************************************************/ -import static org.junit.Assert.*; - -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.opennebula.client.Client; -import org.opennebula.client.OneResponse; -import org.opennebula.client.acl.*; - -public class AclTest -{ - - private static Acl acl; - private static AclPool aclPool; - - private static Client client; - - private static OneResponse res; - - /** - * @throws java.lang.Exception - */ - @BeforeClass - public static void setUpBeforeClass() throws Exception - { - client = new Client(); - aclPool = new AclPool(client); - } - - /** - * @throws java.lang.Exception - */ - @AfterClass - public static void tearDownAfterClass() throws Exception - { - } - - /** - * @throws java.lang.Exception - */ - @Before - public void setUp() throws Exception - { - } - - /** - * @throws java.lang.Exception - */ - @After - public void tearDown() throws Exception - { - for(Acl rule : aclPool) - { - if( rule.id() > 4 ) - { - rule.delete(); - } - } - } - - @Test - public void defaultRules() - { - res = aclPool.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertEquals(5, aclPool.getLength()); - } -/* - @Test - public void hexAllocate() - { - // Allocate rule "#1 VM+HOST/@1 INFO+CREATE" - res = Acl.allocate(client, "0x100000001", "0x3200000001", "0x8"); - assertTrue( res.getErrorMessage(), !res.isError() ); - - aclPool.info(); - acl = aclPool.getById( res.getIntMessage() ); - - assertNotNull(acl); - - assertEquals(res.getIntMessage(), acl.id()); - assertEquals(0x100000001L, acl.user()); - assertEquals(0x3200000001L, acl.resource()); - assertEquals(0x8L, acl.rights()); - assertEquals("#1 VM+HOST/@1 CREATE",acl.toString()); - } -*/ -/* - @Test - public void numericAllocate() - { - // Allocate rule "#1 VM+HOST/@1 USE" - res = Acl.allocate(client, 0x100000001L, 214748364801L, 0x1L); - assertTrue( res.getErrorMessage(), !res.isError() ); - - aclPool.info(); - acl = aclPool.getById( res.getIntMessage() ); - - assertNotNull(acl); - - assertEquals(res.getIntMessage(), acl.id()); - assertEquals(0x100000001L, acl.user()); - assertEquals(0x3200000001L, acl.resource()); - assertEquals(0x1L, acl.rights()); - assertEquals("#1 VM+HOST/@1 USE", acl.toString()); - } -*/ - @Test - public void ruleAllocate() - { - try - { - res = Acl.allocate(client, "@507 IMAGE/#456 MANAGE #102"); - assertTrue( res.getErrorMessage(), !res.isError() ); - - aclPool.info(); - acl = aclPool.getById( res.getIntMessage() ); - - assertNotNull(acl); - - assertEquals(res.getIntMessage(), acl.id()); - assertEquals(0x2000001fbL, acl.user()); - assertEquals(0x81000001c8L, acl.resource()); - assertEquals(0x2L, acl.rights()); - assertEquals("@507 IMAGE/#456 MANAGE #102", acl.toString()); - } - catch (RuleParseException e) - { - assertTrue( false ); - } - } - - @Test - public void parseRules() - { - String[] rules = { - "#3 TEMPLATE/#0 USE", - "#2 IMAGE/#0 USE", - "@107 IMAGE+TEMPLATE/@100 USE", - "* VM+IMAGE+TEMPLATE/@100 CREATE+USE", - "#2345 VM+IMAGE+TEMPLATE/* CREATE+USE", - "@7 HOST/#100 USE+MANAGE", - "* HOST+DATASTORE/%100 MANAGE+USE", - "@107 NET/%100 USE" - }; - - long[] users = { - 0x100000003L, - 0x100000002L, - 0x20000006bL, - 0x400000000L, - 0x100000929L, - 0x200000007L, - 0x400000000L, - 0x20000006bL - }; - - long[] resources = { - 0x20100000000L, - 0x8100000000L, - 0x28200000064L, - 0x29200000064L, - 0x29400000000L, - 0x2100000064L, - 0x102800000064L, - 0x4800000064L - }; - - long[] rights = { - 0x1L, - 0x1L, - 0x1L, - 0x9L, - 0x9L, - 0x3L, - 0x3L, - 0x1L - }; - - for( int i = 0; i < rules.length; i++ ) - { - try - { - res = Acl.allocate(client, rules[i]); - assertTrue( res.getErrorMessage(), !res.isError() ); - - aclPool.info(); - acl = aclPool.getById( res.getIntMessage() ); - - assertNotNull(acl); - - assertEquals(res.getIntMessage(), acl.id()); - assertEquals(users[i], acl.user()); - assertEquals(resources[i], acl.resource()); - assertEquals(rights[i], acl.rights()); - } - catch (RuleParseException e) - { - assertTrue( - "Rule " + rules[i] - + " has been wrongly reported as invalid; " - + e.getMessage(), - false); - } - catch (AssertionError e) - { - assertTrue( - "Rule " + rules[i] - + " assert failure; " - + e.getMessage(), - false); - } - } - } - - @Test - public void delete() - { - try - { - res = Acl.allocate(client, "#1 HOST/#2 USE"); - assertTrue( res.getErrorMessage(), !res.isError() ); - - aclPool.info(); - assertEquals( 6, aclPool.getLength() ); - - res = Acl.delete(client, res.getIntMessage()); - assertTrue( res.getErrorMessage(), !res.isError() ); - - aclPool.info(); - assertEquals( 5, aclPool.getLength() ); - } - catch (RuleParseException e) - { - assertTrue( - "Rule has been wrongly reported as invalid; " - + e.getMessage(), - false); - } - } - - @Test - public void wrongRules() - { - String[] rules = { - "#-3 TEMPLATE/#0 USE", - "#+3 TEMPLATE/#0 USE", - "@3+ TEMPLATE/#0 USE", - "*3 TEMPLATE/#0 USE", - "# TEMPLATE/#0 USE", - "@@ TEMPLATE/#0 USE", - "@#3 TEMPLATE/#0 USE", - "#3 TEMPLATE+HOS/#0 USE", - "#3 /#0 USE", - "#3 TEMPLATE/# USE", - "#3 TEMPLATE/% USE", - "#3 TEMPLATE/#5 USE CREATE", - "#3 TEMPLATE/#5", - "#3 ", - "", - "#2 IMAGE @10654 USE", - "#2 IMAGE/ USE", - "#2 IMAGE#0 USE", - "#2 IMAGE/# USE", - "#2 IMAGE/@- USE", - "#2 IMAGE/#0/#0 USE", - "#2 IMAGE/#0/USE CREATE", - "#2 IMAGE/#0/USE+CREATE", - "#2 IMAGE/#0 IFO", - "#2 IMAGE/#0 USE+CREAT", - }; - - for( int i = 0; i < rules.length; i++ ) - { - try - { - res = Acl.allocate(client, rules[i]); - - assertTrue( "Rule " + rules[i] + - " should have thrown an exception", - false); - } - catch (RuleParseException e) - { - } - } - } -} diff --git a/src/oca/java/test/DocumentTest.java b/src/oca/java/test/DocumentTest.java deleted file mode 100644 index 16e27a1140..0000000000 --- a/src/oca/java/test/DocumentTest.java +++ /dev/null @@ -1,163 +0,0 @@ -/******************************************************************************* - * Copyright 2002-2017, OpenNebula Project, OpenNebula Systems - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - ******************************************************************************/ -import static org.junit.Assert.assertTrue; - -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.opennebula.client.Client; -import org.opennebula.client.OneResponse; - - -public class DocumentTest -{ - private static GenericObjA objA; - private static GenericObjB objB; - private static GenericObjAPool objAPool; - private static GenericObjBPool objBPool; - - private static Client client; - - private static OneResponse res; - - private static String nameA = "obj_one"; - private static String nameB = "obj_two"; - - private static String template_one = - "NAME = \"" + nameA + "\"\n" + - "ATT1 = \"VAL1\"\n" + - "ATT2 = \"VAL2\""; - - private static String template_two = - "NAME = \"" + nameB + "\"\n" + - "ATT1 = \"VAL1\"\n" + - "ATT2 = \"VAL2\""; - - /** - * @throws java.lang.Exception - */ - @BeforeClass - public static void setUpBeforeClass() throws Exception - { - client = new Client(); - objAPool = new GenericObjAPool(client); - objBPool = new GenericObjBPool(client); - } - - /** - * @throws java.lang.Exception - */ - @AfterClass - public static void tearDownAfterClass() throws Exception - { - } - - /** - * @throws java.lang.Exception - */ - @Before - public void setUp() throws Exception - { - res = GenericObjA.allocate(client, template_one); - assertTrue( res.getErrorMessage(), !res.isError() ); - - int oidA = Integer.parseInt(res.getMessage()); - objA = new GenericObjA(oidA, client); - - res = GenericObjB.allocate(client, template_two); - assertTrue( res.getErrorMessage(), !res.isError() ); - - int oidB = Integer.parseInt(res.getMessage()); - objB = new GenericObjB(oidB, client); - - res = objA.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = objB.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - } - - /** - * @throws java.lang.Exception - */ - @After - public void tearDown() throws Exception - { - objA.delete(); - objB.delete(); - } - - @Test - public void sameOidSpace() - { - assertTrue( - "objA id : " + objA.getId() + "; objB id : " + objB.getId(), - objB.id() == objA.id()+1 ); - } - - @Test - public void differentPools() - { - res = objAPool.infoAll(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - boolean foundA = false; - boolean foundB = false; - - for(GenericObjA ob : objAPool) - { - foundA = foundA || ob.getName().equals(nameA); - foundB = foundB || ob.getName().equals(nameB); - } - - assertTrue( foundA ); - assertTrue( !foundB ); - - - - res = objBPool.infoMine(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - foundA = false; - foundB = false; - - for(GenericObjB ob : objBPool) - { - foundA = foundA || ob.getName().equals(nameA); - foundB = foundB || ob.getName().equals(nameB); - } - - assertTrue( !foundA ); - assertTrue( foundB ); - } - - @Test - public void lock() - { - res = objA.lock("doctest"); - assertTrue( res.getErrorMessage(), !res.isError() ); - assertTrue( res.getMessage(), res.getBooleanMessage() == true ); - - res = objA.lock("doctest"); - assertTrue( res.getErrorMessage(), !res.isError() ); - assertTrue( res.getMessage(), res.getBooleanMessage() == false ); - - res = objA.unlock("doctest"); - assertTrue( res.getErrorMessage(), !res.isError() ); - } -} diff --git a/src/oca/java/test/GenericObjA.java b/src/oca/java/test/GenericObjA.java deleted file mode 100644 index b75bbebd57..0000000000 --- a/src/oca/java/test/GenericObjA.java +++ /dev/null @@ -1,25 +0,0 @@ -import org.opennebula.client.Client; -import org.opennebula.client.OneResponse; -import org.opennebula.client.document.Document; -import org.w3c.dom.Node; - -public class GenericObjA extends Document -{ - private static final int TYPE = 200; - - public GenericObjA(int id, Client client) - { - super(id, client); - } - - public GenericObjA(Node xmlElement, Client client) - { - super(xmlElement, client); - } - - - public static OneResponse allocate(Client client, String description) - { - return Document.allocate(client, description, TYPE); - } -} \ No newline at end of file diff --git a/src/oca/java/test/GenericObjAPool.java b/src/oca/java/test/GenericObjAPool.java deleted file mode 100644 index fe63f198a5..0000000000 --- a/src/oca/java/test/GenericObjAPool.java +++ /dev/null @@ -1,53 +0,0 @@ -import java.util.AbstractList; -import java.util.Iterator; - -import org.opennebula.client.Client; -import org.opennebula.client.document.DocumentPool; -import org.w3c.dom.Node; - - -public class GenericObjAPool extends DocumentPool implements Iterable -{ - private static final int TYPE = 200; - - @Override - protected int type() - { - return TYPE; - } - - public GenericObjAPool(Client client) - { - super(client); - } - - public GenericObjAPool(Client client, int filter) - { - super(client, filter); - } - - @Override - public GenericObjA factory(Node node) - { - return new GenericObjA(node, client); - } - - @Override - public Iterator iterator() - { - AbstractList ab = new AbstractList() - { - public int size() - { - return getLength(); - } - - public GenericObjA get(int index) - { - return (GenericObjA) item(index); - } - }; - - return ab.iterator(); - } -} diff --git a/src/oca/java/test/GenericObjB.java b/src/oca/java/test/GenericObjB.java deleted file mode 100644 index 41c6e799ed..0000000000 --- a/src/oca/java/test/GenericObjB.java +++ /dev/null @@ -1,25 +0,0 @@ -import org.opennebula.client.Client; -import org.opennebula.client.OneResponse; -import org.opennebula.client.document.Document; -import org.w3c.dom.Node; - -public class GenericObjB extends Document -{ - private static final int TYPE = 201; - - public GenericObjB(int id, Client client) - { - super(id, client); - } - - public GenericObjB(Node xmlElement, Client client) - { - super(xmlElement, client); - } - - - public static OneResponse allocate(Client client, String description) - { - return Document.allocate(client, description, TYPE); - } -} \ No newline at end of file diff --git a/src/oca/java/test/GenericObjBPool.java b/src/oca/java/test/GenericObjBPool.java deleted file mode 100644 index 04025070e3..0000000000 --- a/src/oca/java/test/GenericObjBPool.java +++ /dev/null @@ -1,53 +0,0 @@ -import java.util.AbstractList; -import java.util.Iterator; - -import org.opennebula.client.Client; -import org.opennebula.client.document.DocumentPool; -import org.w3c.dom.Node; - - -public class GenericObjBPool extends DocumentPool implements Iterable -{ - private static final int TYPE = 201; - - @Override - protected int type() - { - return TYPE; - } - - public GenericObjBPool(Client client) - { - super(client); - } - - public GenericObjBPool(Client client, int filter) - { - super(client, filter); - } - - @Override - public GenericObjB factory(Node node) - { - return new GenericObjB(node, client); - } - - @Override - public Iterator iterator() - { - AbstractList ab = new AbstractList() - { - public int size() - { - return getLength(); - } - - public GenericObjB get(int index) - { - return (GenericObjB) item(index); - } - }; - - return ab.iterator(); - } -} diff --git a/src/oca/java/test/GroupTest.java b/src/oca/java/test/GroupTest.java deleted file mode 100644 index 8fe138e4c0..0000000000 --- a/src/oca/java/test/GroupTest.java +++ /dev/null @@ -1,306 +0,0 @@ -/******************************************************************************* - * Copyright 2002-2017, OpenNebula Project, OpenNebula Systems - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - ******************************************************************************/ -import static org.junit.Assert.*; - -import javax.xml.xpath.XPath; -import javax.xml.xpath.XPathExpressionException; -import javax.xml.xpath.XPathFactory; - -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.opennebula.client.Client; -import org.opennebula.client.OneResponse; -import org.opennebula.client.OneSystem; -import org.opennebula.client.group.Group; -import org.opennebula.client.group.GroupPool; -import org.opennebula.client.user.*; -import org.w3c.dom.Node; -import java.util.Hashtable; - -public class GroupTest -{ - - private static Group group; - private static GroupPool groupPool; - private static User user; - - private static Client client; - - private static OneResponse res; - - private static String group_name = "test_group"; - - /** - * @throws java.lang.Exception - */ - @BeforeClass - public static void setUpBeforeClass() throws Exception - { - client = new Client(); - groupPool = new GroupPool(client); - } - - /** - * @throws java.lang.Exception - */ - @AfterClass - public static void tearDownAfterClass() throws Exception - { - } - - /** - * @throws java.lang.Exception - */ - @Before - public void setUp() throws Exception - { - res = Group.allocate(client, group_name); - - assertTrue( res.getErrorMessage(), !res.isError() ); - - int group_id = res.isError() ? -1 : Integer.parseInt(res.getMessage()); - group = new Group(group_id, client); - - res = User.allocate(client, "new_test_user", "new_test_password"); - - assertTrue( res.getErrorMessage(), !res.isError() ); - - int uid = Integer.parseInt(res.getMessage()); - user = new User(uid, client); - } - - /** - * @throws java.lang.Exception - */ - @After - public void tearDown() throws Exception - { - user.delete(); - group.delete(); - } - - @Test - public void allocate() - { - group.delete(); - - res = Group.allocate(client, group_name); - assertTrue( res.getErrorMessage(), !res.isError() ); - - int group_id = res.isError() ? -1 : Integer.parseInt(res.getMessage()); - group = new Group(group_id, client); - - - groupPool.info(); - - boolean found = false; - for(Group img : groupPool) - { - found = found || img.getName().equals(group_name); - } - - assertTrue( found ); - } - - @Test - public void info() - { - res = group.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( group.id() >= 100 ); - assertTrue( group.getName().equals(group_name) ); - } - - @Test - public void delete() - { - res = group.delete(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = group.info(); - assertTrue( res.isError() ); - - res = groupPool.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - boolean found = false; - for(Group g : groupPool) - { - found = found || g.getName().equals(group_name); - } - - assertTrue( !found ); - } - - @Test - public void defaultqutoas() - { - OneSystem system = new OneSystem(client); - - res = system.getGroupQuotas(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = system.setGroupQuotas("VM = [ VMS = 7, MEMORY = 0, CPU = 3, SYSTEM_DISK_SIZE = 1 ]"); - assertTrue( res.getErrorMessage(), !res.isError() ); - - Node node = system.getGroupQuotasXML(); - XPathFactory factory = XPathFactory.newInstance(); - XPath xpath = factory.newXPath(); - - try - { - assertTrue( xpath.evaluate("VM_QUOTA/VM/VMS", node).equals("7") ); - } catch (XPathExpressionException e) - { - assertTrue(e.getMessage(), false); - } - } - - @Test - public void addAdmin() - { - res = group.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertFalse( group.contains(user.id()) ); - assertFalse( group.containsAdmin(user.id()) ); - - res = group.addAdmin( user.id() ); - assertTrue( res.isError() ); - - group.info(); - assertFalse( group.contains(user.id()) ); - assertFalse( group.containsAdmin(user.id()) ); - - res = user.chgrp( group.id() ); - assertTrue( res.getErrorMessage(), !res.isError() ); - - group.info(); - assertTrue( group.contains(user.id()) ); - assertFalse( group.containsAdmin(user.id()) ); - - res = group.addAdmin( user.id() ); - assertTrue( res.getErrorMessage(), !res.isError() ); - - group.info(); - assertTrue( group.contains(user.id()) ); - assertTrue( group.containsAdmin(user.id()) ); - } - - - @Test - public void delAdmin() - { - res = group.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = group.delAdmin( user.id() ); - assertTrue( res.isError() ); - - res = user.chgrp( group.id() ); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = group.delAdmin( user.id() ); - assertTrue( res.isError() ); - - res = group.addAdmin( user.id() ); - assertTrue( res.getErrorMessage(), !res.isError() ); - - group.info(); - assertTrue( group.contains(user.id()) ); - assertTrue( group.containsAdmin(user.id()) ); - - res = group.delAdmin( user.id() ); - assertTrue( res.getErrorMessage(), !res.isError() ); - - group.info(); - assertTrue( group.contains(user.id()) ); - assertFalse( group.containsAdmin(user.id()) ); - } - - @Test - public void userGroupRelations() - { - Hashtable users = new Hashtable(); - Hashtable groups = new Hashtable(); - - // Create all users and groups. Add user_* to corresponding group_* - String[] names = {"a", "b", "c", "d"}; - for(String name : names) - { - res = User.allocate(client, "user_"+name, "password"); - assertTrue( res.getErrorMessage(), !res.isError() ); - - users.put( name, - new User(Integer.parseInt(res.getMessage()), client ) - ); - - res = Group.allocate(client, "group_"+name); - assertTrue( res.getErrorMessage(), !res.isError() ); - - groups.put( name, - new Group(Integer.parseInt(res.getMessage()), client ) - ); - - users.get(name).addgroup( groups.get(name).id() ); - } - - // Add all users to group_b - for( User u : users.values() ) - { - u.addgroup( groups.get("b").id() ); - } - - // Change user_c & _d main group - users.get("c").chgrp( groups.get("d").id() ); - users.get("d").chgrp( groups.get("c").id() ); - - - // Check cross-references so far - for( User u : users.values() ) - { - assertTrue( !u.info().isError() ); - } - - for( Group g : groups.values() ) - { - assertTrue( !g.info().isError() ); - } - - assertTrue( groups.get("a").contains( users.get("a").id() ) ); - assertFalse( groups.get("a").contains( users.get("b").id() ) ); - assertFalse( groups.get("a").contains( users.get("c").id() ) ); - assertFalse( groups.get("a").contains( users.get("d").id() ) ); - - assertTrue( groups.get("b").contains( users.get("a").id() ) ); - assertTrue( groups.get("b").contains( users.get("b").id() ) ); - assertTrue( groups.get("b").contains( users.get("c").id() ) ); - assertTrue( groups.get("b").contains( users.get("d").id() ) ); - - assertFalse( groups.get("c").contains( users.get("a").id() ) ); - assertFalse( groups.get("c").contains( users.get("b").id() ) ); - assertTrue( groups.get("c").contains( users.get("c").id() ) ); - assertTrue( groups.get("c").contains( users.get("d").id() ) ); - assertFalse( groups.get("d").contains( users.get("a").id() ) ); - assertFalse( groups.get("d").contains( users.get("b").id() ) ); - assertTrue( groups.get("d").contains( users.get("c").id() ) ); - assertTrue( groups.get("d").contains( users.get("d").id() ) ); - } -} diff --git a/src/oca/java/test/HostTest.java b/src/oca/java/test/HostTest.java deleted file mode 100644 index 4e6b875191..0000000000 --- a/src/oca/java/test/HostTest.java +++ /dev/null @@ -1,217 +0,0 @@ -/******************************************************************************* - * Copyright 2002-2017, OpenNebula Project, OpenNebula Systems - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - ******************************************************************************/ -import static org.junit.Assert.assertTrue; - -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.opennebula.client.Client; -import org.opennebula.client.OneResponse; -import org.opennebula.client.host.Host; -import org.opennebula.client.host.HostPool; -import org.w3c.dom.Node; - -public class HostTest -{ - class HostXML extends Host - { - public HostXML(Node node, Client client){ super(node, client); } - } - - private static Host host; - private static HostPool hostPool; - private static Client client; - private OneResponse res; - private static String name = "new_test_host"; - - /** - * @throws java.lang.Exception - */ - @BeforeClass - public static void setUpBeforeClass() throws Exception - { - client = new Client(); - hostPool = new HostPool(client); - } - - /** - * @throws java.lang.Exception - */ - @AfterClass - public static void tearDownAfterClass() throws Exception - { - } - - /** - * @throws java.lang.Exception - */ - @Before - public void setUp() throws Exception - { - res = Host.allocate(client, name, "dummy", "dummy"); - - int hid = !res.isError() ? Integer.parseInt(res.getMessage()) : -1; - host = new Host(hid, client); - } - - /** - * @throws java.lang.Exception - */ - @After - public void tearDown() throws Exception - { - host.delete(); - Thread.sleep(2000); - } - - @Test - public void allocate() - { - String name = "allocate_test"; - - res = Host.allocate(client, name, "im_dummy", "vmm_dummy"); - assertTrue( res.getErrorMessage(), !res.isError() ); -// assertTrue( res.getMessage().equals("0") ); - - hostPool.info(); - - boolean found = false; - for(Host h : hostPool) - { - found = found || h.getName().equals(name); - } - - assertTrue( found ); - } - - @Test - public void info() - { - res = host.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - -// assertTrue( host.getId().equals("0") ); - assertTrue( host.id() >= 0 ); - -// assertTrue( host.shortStateStr().equals("on") ); - } - - @Test - public void enable() - { - res = host.enable(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - host.info(); - assertTrue( host.isEnabled() ); - } - - @Test - public void disable() - { - res = host.disable(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - host.info(); - assertTrue( !host.isEnabled() ); - } - - @Test - public void delete() - { - String name = host.getName(); - - res = host.delete(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = host.info(); - assertTrue( res.isError() ); - - res = hostPool.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - boolean found = false; - for(Host h : hostPool) - { - found = found || h.getName().equals(name); - } - - assertTrue( !found ); - } - - @Test - public void update() - { - res = host.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( host.xpath("TEMPLATE/ATT1").equals( "" ) ); - assertTrue( host.xpath("TEMPLATE/ATT2").equals( "" ) ); - - String new_template = "ATT2 = NEW_VAL\n" + - "ATT3 = VAL3"; - - res = host.update(new_template); - assertTrue( res.getErrorMessage(), !res.isError() ); - - - res = host.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - assertTrue( host.xpath("TEMPLATE/ATT1").equals( "" ) ); - assertTrue( host.xpath("TEMPLATE/ATT2").equals( "NEW_VAL" ) ); - assertTrue( host.xpath("TEMPLATE/ATT3").equals( "VAL3" ) ); - } - -/* - @Test - public void attributes() - { - DocumentBuilder builder; - Document doc; - Element xml; - - try - { - builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); - - doc = builder.parse( new File("./fixtures/host.xml") ); - xml = doc.getDocumentElement(); - - host = new HostXML(xml, client); - - assertTrue( host.xpath("ID").equals("7") ); - assertTrue( host.xpath("NAME").equals("dummyhost") ); - assertTrue( host.xpath("STATE").equals("2") ); - assertTrue( host.xpath("IM_MAD").equals("im_dummy") ); - assertTrue( host.xpath("LAST_MON_TIME").equals("1277733596") ); - assertTrue( host.xpath("HOST_SHARE/MEM_USAGE").equals("1572864") ); - assertTrue( host.xpath("HOST_SHARE/CPU_USAGE").equals("300") ); - assertTrue( host.xpath("HOST_SHARE/FREE_CPU").equals("800") ); - assertTrue( host.xpath("HOST_SHARE/RUNNING_VMS").equals("3") ); - assertTrue( host.xpath("TEMPLATE/CPUSPEED").equals("2.2GHz") ); - assertTrue( host.xpath("TEMPLATE/HYPERVISOR").equals("dummy") ); - assertTrue( host.xpath("TEMPLATE/TOTALMEMORY").equals("16777216") ); - - } catch (Exception e) - { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } -*/ -} diff --git a/src/oca/java/test/ImageTest.java b/src/oca/java/test/ImageTest.java deleted file mode 100644 index ee987af35b..0000000000 --- a/src/oca/java/test/ImageTest.java +++ /dev/null @@ -1,260 +0,0 @@ -/******************************************************************************* - * Copyright 2002-2017, OpenNebula Project, OpenNebula Systems - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - ******************************************************************************/ -import static org.junit.Assert.assertTrue; - -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.opennebula.client.Client; -import org.opennebula.client.OneResponse; -import org.opennebula.client.image.*; - - - -public class ImageTest -{ - - private static Image image; - private static ImagePool imagePool; - - private static Client client; - - private static OneResponse res; - private static int cont = 0; - - private static String template() - { - cont++; - - return "NAME = \"test_img_" + cont + "\"\n" + - "PATH = /etc/hosts\n" + - "ATT1 = \"VAL1\"\n" + - "ATT2 = \"VAL2\""; - } - - /** - * Wait until the Image changes to the specified state. - * There is a time-out of 10 seconds. - */ - static void waitAssert(Image img, String state) - { - int n_steps = 10; - int step = 1000; - - int i = 0; - - img.info(); - - while( !( img.stateString().equals(state) || i > n_steps ) - && !img.stateString().equals("ERROR") ) - { - try{ Thread.sleep(step); } catch (Exception e){} - - img.info(); - i++; - } - - assertTrue( - "Image timeout, wanted state: " + state + "; it is in state " - + img.stateString(), img.stateString().equals(state) ); - } - - /** - * @throws java.lang.Exception - */ - @BeforeClass - public static void setUpBeforeClass() throws Exception - { - client = new Client(); - imagePool = new ImagePool(client); - } - - /** - * @throws java.lang.Exception - */ - @AfterClass - public static void tearDownAfterClass() throws Exception - { - } - - /** - * @throws java.lang.Exception - */ - @Before - public void setUp() throws Exception - { - res = Image.allocate(client, template(), 1); - - int imgid = res.isError() ? -1 : Integer.parseInt(res.getMessage()); - image = new Image(imgid, client); - - waitAssert(image, "READY"); - } - - /** - * @throws java.lang.Exception - */ - @After - public void tearDown() throws Exception - { - image.delete(); - } - - @Test - public void allocate() - { - image.delete(); - - res = Image.allocate(client, template(), 1); - assertTrue( res.getErrorMessage(), !res.isError() ); - - int imgid = res.isError() ? -1 : Integer.parseInt(res.getMessage()); - image = new Image(imgid, client); - - - res = imagePool.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - boolean found = false; - for(Image img : imagePool) - { - found = found || img.getName().equals("test_img_"+cont); - } - - assertTrue( found ); - } - - @Test - public void clone_method() - { - res = image.clone("cloned_image"); - assertTrue(res.getErrorMessage(), !res.isError()); - - int imgid = res.isError() ? -1 : Integer.parseInt(res.getMessage()); - Image cloned_image = new Image(imgid, client); - - res = imagePool.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - boolean found = false; - for(Image img : imagePool) - { - found = found || img.getName().equals("cloned_image"); - } - - assertTrue( found ); - - res = cloned_image.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - assertTrue( cloned_image.getName().equals("cloned_image") ); - } - - @Test - public void info() - { - res = image.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - -// assertTrue( image.getId().equals("0") ); -// assertTrue( image.id() == 0 ); - assertTrue( image.getName().equals("test_img_"+cont) ); - } - - @Test - public void update() - { - res = image.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( image.xpath("TEMPLATE/ATT1").equals( "VAL1" ) ); - assertTrue( image.xpath("TEMPLATE/ATT2").equals( "VAL2" ) ); - - String new_template = "ATT2 = NEW_VAL\n" + - "ATT3 = VAL3"; - - res = image.update(new_template); - assertTrue( res.getErrorMessage(), !res.isError() ); - - - res = image.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - assertTrue( image.xpath("TEMPLATE/ATT1").equals( "" ) ); - assertTrue( image.xpath("TEMPLATE/ATT2").equals( "NEW_VAL" ) ); - assertTrue( image.xpath("TEMPLATE/ATT3").equals( "VAL3" ) ); - } - - @Test - public void enable() - { - res = image.enable(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - image.info(); - assertTrue( image.isEnabled() ); - } - - @Test - public void disable() - { - res = image.disable(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - image.info(); - assertTrue( res.getErrorMessage(), !image.isEnabled() ); - } - - @Test - public void publish() - { - res = image.publish(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - image.info(); - assertTrue( image.xpath("PERMISSIONS/GROUP_U").equals( "1" ) ); - } - - @Test - public void unpublish() - { - res = image.unpublish(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - image.info(); - assertTrue( image.xpath("PERMISSIONS/GROUP_U").equals( "0" ) ); - } - - @Test - public void attributes() - { - res = image.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - -// assertTrue( image.xpath("ID").equals("0") ); - assertTrue( image.xpath("NAME").equals("test_img_"+cont) ); - } - - @Test - public void delete() - { - res = image.delete(); - assertTrue( res.getErrorMessage(), !res.isError() ); - -// res = image.info(); -// assertTrue( res.isError() ); - } -} diff --git a/src/oca/java/test/SecurityGroupTest.java b/src/oca/java/test/SecurityGroupTest.java deleted file mode 100644 index a57019a8d7..0000000000 --- a/src/oca/java/test/SecurityGroupTest.java +++ /dev/null @@ -1,266 +0,0 @@ -/******************************************************************************* - * Copyright 2002-2017, OpenNebula Project, OpenNebula Systems - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - ******************************************************************************/ -import static org.junit.Assert.assertTrue; - -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.opennebula.client.Client; -import org.opennebula.client.OneResponse; -import org.opennebula.client.group.Group; -import org.opennebula.client.secgroup.*; -import org.opennebula.client.user.User; - - - - -public class SecurityGroupTest -{ - - private static SecurityGroup sg; - private static SecurityGroupPool pool; - - private static Client client; - - private static OneResponse res; - private static String name = "new_test_sg"; - - - private static String template_str = - "NAME = \"" + name + "\"\n" + - "DESCRIPTION = \"test security group\"\n"+ - "ATT1 = \"VAL1\"\n" + - "ATT2 = \"VAL2\""; - - /** - * @throws java.lang.Exception - */ - @BeforeClass - public static void setUpBeforeClass() throws Exception - { - client = new Client(); - pool = new SecurityGroupPool(client); - } - - /** - * @throws java.lang.Exception - */ - @AfterClass - public static void tearDownAfterClass() throws Exception - { - } - - /** - * @throws java.lang.Exception - */ - @Before - public void setUp() throws Exception - { - res = SecurityGroup.allocate(client, template_str); - - int oid = res.isError() ? -1 : Integer.parseInt(res.getMessage()); - sg = new SecurityGroup(oid, client); - } - - /** - * @throws java.lang.Exception - */ - @After - public void tearDown() throws Exception - { - sg.delete(); - } - - @Test - public void allocate() - { - sg.delete(); - - res = SecurityGroup.allocate(client, template_str); - assertTrue( res.getErrorMessage(), !res.isError() ); - - int oid = res.isError() ? -1 : Integer.parseInt(res.getMessage()); - sg = new SecurityGroup(oid, client); - - - pool.info(); - - boolean found = false; - for(SecurityGroup temp : pool) - { - found = found || temp.getName().equals(name); - } - - assertTrue( found ); - } - - @Test - public void info() - { - res = sg.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( sg.getName().equals(name) ); - } - - @Test - public void update() - { - res = sg.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( sg.xpath("TEMPLATE/ATT1").equals( "VAL1" ) ); - assertTrue( sg.xpath("TEMPLATE/ATT2").equals( "VAL2" ) ); - - String new_sg = "ATT2 = NEW_VAL\n" + - "ATT3 = VAL3"; - - res = sg.update(new_sg); - assertTrue( res.getErrorMessage(), !res.isError() ); - - - res = sg.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - assertTrue( sg.xpath("TEMPLATE/ATT1").equals( "" ) ); - assertTrue( sg.xpath("TEMPLATE/ATT2").equals( "NEW_VAL" ) ); - assertTrue( sg.xpath("TEMPLATE/ATT3").equals( "VAL3" ) ); - } - - @Test - public void chmod() - { - res = sg.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - String owner_a = sg.xpath("PERMISSIONS/OWNER_A"); - String group_a = sg.xpath("PERMISSIONS/GROUP_A"); - - res = sg.chmod(0, 1, -1, 1, 0, -1, 1, 1, 0); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = sg.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( sg.xpath("PERMISSIONS/OWNER_U").equals("0") ); - assertTrue( sg.xpath("PERMISSIONS/OWNER_M").equals("1") ); - assertTrue( sg.xpath("PERMISSIONS/OWNER_A").equals(owner_a) ); - assertTrue( sg.xpath("PERMISSIONS/GROUP_U").equals("1") ); - assertTrue( sg.xpath("PERMISSIONS/GROUP_M").equals("0") ); - assertTrue( sg.xpath("PERMISSIONS/GROUP_A").equals(group_a) ); - assertTrue( sg.xpath("PERMISSIONS/OTHER_U").equals("1") ); - assertTrue( sg.xpath("PERMISSIONS/OTHER_M").equals("1") ); - assertTrue( sg.xpath("PERMISSIONS/OTHER_A").equals("0") ); - } - - @Test - public void chmod_octet() - { - res = sg.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = sg.chmod(640); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = sg.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( sg.xpath("PERMISSIONS/OWNER_U").equals("1") ); - assertTrue( sg.xpath("PERMISSIONS/OWNER_M").equals("1") ); - assertTrue( sg.xpath("PERMISSIONS/OWNER_A").equals("0") ); - assertTrue( sg.xpath("PERMISSIONS/GROUP_U").equals("1") ); - assertTrue( sg.xpath("PERMISSIONS/GROUP_M").equals("0") ); - assertTrue( sg.xpath("PERMISSIONS/GROUP_A").equals("0") ); - assertTrue( sg.xpath("PERMISSIONS/OTHER_U").equals("0") ); - assertTrue( sg.xpath("PERMISSIONS/OTHER_M").equals("0") ); - assertTrue( sg.xpath("PERMISSIONS/OTHER_A").equals("0") ); - - res = sg.chmod("147"); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = sg.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( sg.xpath("PERMISSIONS/OWNER_U").equals("0") ); - assertTrue( sg.xpath("PERMISSIONS/OWNER_M").equals("0") ); - assertTrue( sg.xpath("PERMISSIONS/OWNER_A").equals("1") ); - assertTrue( sg.xpath("PERMISSIONS/GROUP_U").equals("1") ); - assertTrue( sg.xpath("PERMISSIONS/GROUP_M").equals("0") ); - assertTrue( sg.xpath("PERMISSIONS/GROUP_A").equals("0") ); - assertTrue( sg.xpath("PERMISSIONS/OTHER_U").equals("1") ); - assertTrue( sg.xpath("PERMISSIONS/OTHER_M").equals("1") ); - assertTrue( sg.xpath("PERMISSIONS/OTHER_A").equals("1") ); - } - - @Test - public void attributes() - { - res = sg.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - -// assertTrue( sg.xpath("ID").equals("0") ); - assertTrue( sg.xpath("NAME").equals(name) ); - } - - @Test - public void delete() - { - res = sg.delete(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = sg.info(); - assertTrue( res.isError() ); - } - - @Test - public void chown() - { - // Create a new User and Group - res = User.allocate(client, "sg_test_user", "password"); - assertTrue( res.getErrorMessage(), !res.isError() ); - - int uid = Integer.parseInt(res.getMessage()); - - res = Group.allocate(client, "sg_test_group"); - assertTrue( res.getErrorMessage(), !res.isError() ); - - int gid = Integer.parseInt(res.getMessage()); - - res = sg.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( sg.uid() == 0 ); - assertTrue( sg.gid() == 0 ); - - res = sg.chown(uid, gid); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = sg.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( sg.uid() == uid ); - assertTrue( sg.gid() == gid ); - - res = sg.chgrp(0); - - res = sg.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( sg.uid() == uid ); - assertTrue( sg.gid() == 0 ); - } -} diff --git a/src/oca/java/test/SessionTest.java b/src/oca/java/test/SessionTest.java deleted file mode 100644 index 03a392dadd..0000000000 --- a/src/oca/java/test/SessionTest.java +++ /dev/null @@ -1,87 +0,0 @@ -/******************************************************************************* - * Copyright 2002-2017, OpenNebula Project, OpenNebula Systems - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - ******************************************************************************/ -import static org.junit.Assert.*; - -import org.junit.Test; -import org.opennebula.client.*; -import org.w3c.dom.Node; - -public class SessionTest { - - @Test - public void createSession() - { - Client oneClient = null; - try - { - oneClient = new Client(); - } - catch (Exception e) - { - System.out.println(e.getMessage()); - } - - assertNotNull(oneClient); - } - - @Test - public void wrong_url() - { - Client oneClient = null; - try - { - // The HTTP is misspelled - oneClient = new Client(null,"HTP://localhost:2633/RPC2"); - } - catch (Exception e) - { -// System.out.println(e.getMessage()); - } - - assertNull("Client should complain about misspelled url", oneClient); - } - - @Test - public void version() - { - Client oneClient = null; - try - { - oneClient = new Client(); - } - catch (Exception e) - { - assertTrue( e.getMessage(), false ); - } - - OneSystem system = new OneSystem(oneClient); - - OneResponse res = system.getOnedVersion(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = system.getConfiguration(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - Node config = system.getConfigurationXML(); - assertTrue( "XML configuration is null", config != null ); - - boolean compatible = system.compatibleVersion(); - assertTrue( - "Incompatible version reported, " + - OneSystem.VERSION + ", " + system.getOnedVersion().getMessage(), - compatible ); - } -} diff --git a/src/oca/java/test/TemplateTest.java b/src/oca/java/test/TemplateTest.java deleted file mode 100644 index 397509cf8d..0000000000 --- a/src/oca/java/test/TemplateTest.java +++ /dev/null @@ -1,304 +0,0 @@ -/******************************************************************************* - * Copyright 2002-2017, OpenNebula Project, OpenNebula Systems - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - ******************************************************************************/ -import static org.junit.Assert.assertTrue; - -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.opennebula.client.Client; -import org.opennebula.client.OneResponse; -import org.opennebula.client.group.Group; -import org.opennebula.client.template.*; -import org.opennebula.client.user.User; -import org.opennebula.client.vm.VirtualMachine; - - - -public class TemplateTest -{ - - private static Template template; - private static TemplatePool templatePool; - - private static Client client; - - private static OneResponse res; - private static String name = "new_test_template"; - - - private static String template_str = - "NAME = \"" + name + "\"\n" + - "CPU = \"1\"\n" + - "MEMORY = \"128\"\n" + - "ATT1 = \"VAL1\"\n" + - "ATT2 = \"VAL2\""; - - /** - * @throws java.lang.Exception - */ - @BeforeClass - public static void setUpBeforeClass() throws Exception - { - client = new Client(); - templatePool = new TemplatePool(client); - } - - /** - * @throws java.lang.Exception - */ - @AfterClass - public static void tearDownAfterClass() throws Exception - { - } - - /** - * @throws java.lang.Exception - */ - @Before - public void setUp() throws Exception - { - res = Template.allocate(client, template_str); - - int oid = res.isError() ? -1 : Integer.parseInt(res.getMessage()); - template = new Template(oid, client); - } - - /** - * @throws java.lang.Exception - */ - @After - public void tearDown() throws Exception - { - template.delete(); - } - - @Test - public void allocate() - { - template.delete(); - - res = Template.allocate(client, template_str); - assertTrue( res.getErrorMessage(), !res.isError() ); - - int oid = res.isError() ? -1 : Integer.parseInt(res.getMessage()); - template = new Template(oid, client); - - - templatePool.info(); - - boolean found = false; - for(Template temp : templatePool) - { - found = found || temp.getName().equals(name); - } - - assertTrue( found ); - } - - @Test - public void info() - { - res = template.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - -// assertTrue( template.getId().equals("0") ); -// assertTrue( template.id() == 0 ); - assertTrue( template.getName().equals(name) ); - } - - @Test - public void update() - { - res = template.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( template.xpath("TEMPLATE/ATT1").equals( "VAL1" ) ); - assertTrue( template.xpath("TEMPLATE/ATT2").equals( "VAL2" ) ); - - String new_template = "ATT2 = NEW_VAL\n" + - "ATT3 = VAL3"; - - res = template.update(new_template); - assertTrue( res.getErrorMessage(), !res.isError() ); - - - res = template.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - assertTrue( template.xpath("TEMPLATE/ATT1").equals( "" ) ); - assertTrue( template.xpath("TEMPLATE/ATT2").equals( "NEW_VAL" ) ); - assertTrue( template.xpath("TEMPLATE/ATT3").equals( "VAL3" ) ); - } - - @Test - public void publish() - { - res = template.publish(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - template.info(); - assertTrue( template.xpath("PERMISSIONS/GROUP_U").equals("1") ); - } - - @Test - public void unpublish() - { - res = template.unpublish(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - template.info(); - assertTrue( template.xpath("PERMISSIONS/GROUP_U").equals("0") ); - } - - @Test - public void chmod() - { - res = template.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - String owner_a = template.xpath("PERMISSIONS/OWNER_A"); - String group_a = template.xpath("PERMISSIONS/GROUP_A"); - - res = template.chmod(0, 1, -1, 1, 0, -1, 1, 1, 0); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = template.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( template.xpath("PERMISSIONS/OWNER_U").equals("0") ); - assertTrue( template.xpath("PERMISSIONS/OWNER_M").equals("1") ); - assertTrue( template.xpath("PERMISSIONS/OWNER_A").equals(owner_a) ); - assertTrue( template.xpath("PERMISSIONS/GROUP_U").equals("1") ); - assertTrue( template.xpath("PERMISSIONS/GROUP_M").equals("0") ); - assertTrue( template.xpath("PERMISSIONS/GROUP_A").equals(group_a) ); - assertTrue( template.xpath("PERMISSIONS/OTHER_U").equals("1") ); - assertTrue( template.xpath("PERMISSIONS/OTHER_M").equals("1") ); - assertTrue( template.xpath("PERMISSIONS/OTHER_A").equals("0") ); - } - - @Test - public void chmod_octet() - { - res = template.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = template.chmod(640); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = template.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( template.xpath("PERMISSIONS/OWNER_U").equals("1") ); - assertTrue( template.xpath("PERMISSIONS/OWNER_M").equals("1") ); - assertTrue( template.xpath("PERMISSIONS/OWNER_A").equals("0") ); - assertTrue( template.xpath("PERMISSIONS/GROUP_U").equals("1") ); - assertTrue( template.xpath("PERMISSIONS/GROUP_M").equals("0") ); - assertTrue( template.xpath("PERMISSIONS/GROUP_A").equals("0") ); - assertTrue( template.xpath("PERMISSIONS/OTHER_U").equals("0") ); - assertTrue( template.xpath("PERMISSIONS/OTHER_M").equals("0") ); - assertTrue( template.xpath("PERMISSIONS/OTHER_A").equals("0") ); - - res = template.chmod("147"); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = template.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( template.xpath("PERMISSIONS/OWNER_U").equals("0") ); - assertTrue( template.xpath("PERMISSIONS/OWNER_M").equals("0") ); - assertTrue( template.xpath("PERMISSIONS/OWNER_A").equals("1") ); - assertTrue( template.xpath("PERMISSIONS/GROUP_U").equals("1") ); - assertTrue( template.xpath("PERMISSIONS/GROUP_M").equals("0") ); - assertTrue( template.xpath("PERMISSIONS/GROUP_A").equals("0") ); - assertTrue( template.xpath("PERMISSIONS/OTHER_U").equals("1") ); - assertTrue( template.xpath("PERMISSIONS/OTHER_M").equals("1") ); - assertTrue( template.xpath("PERMISSIONS/OTHER_A").equals("1") ); - } - - @Test - public void attributes() - { - res = template.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - -// assertTrue( template.xpath("ID").equals("0") ); - assertTrue( template.xpath("NAME").equals(name) ); - } - - @Test - public void delete() - { - res = template.delete(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = template.info(); - assertTrue( res.isError() ); - } - - @Test - public void chown() - { - // Create a new User and Group - res = User.allocate(client, "template_test_user", "password"); - assertTrue( res.getErrorMessage(), !res.isError() ); - - int uid = Integer.parseInt(res.getMessage()); - - res = Group.allocate(client, "template_test_group"); - assertTrue( res.getErrorMessage(), !res.isError() ); - - int gid = Integer.parseInt(res.getMessage()); - - res = template.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( template.uid() == 0 ); - assertTrue( template.gid() == 0 ); - - res = template.chown(uid, gid); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = template.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( template.uid() == uid ); - assertTrue( template.gid() == gid ); - - res = template.chgrp(0); - - res = template.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( template.uid() == uid ); - assertTrue( template.gid() == 0 ); - } - - @Test - public void instantiate() - { - res = template.instantiate("new_vm_name"); - assertTrue( res.getErrorMessage(), !res.isError() ); - - int vm_id = Integer.parseInt(res.getMessage()); - VirtualMachine vm = new VirtualMachine(vm_id, client); - - res = vm.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( vm.getName().equals( "new_vm_name" ) ); - } -} diff --git a/src/oca/java/test/UserTest.java b/src/oca/java/test/UserTest.java deleted file mode 100644 index 36b76b95c4..0000000000 --- a/src/oca/java/test/UserTest.java +++ /dev/null @@ -1,233 +0,0 @@ -/******************************************************************************* - * Copyright 2002-2017, OpenNebula Project, OpenNebula Systems - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - ******************************************************************************/ -import static org.junit.Assert.*; - -import javax.xml.xpath.XPath; -import javax.xml.xpath.XPathExpressionException; -import javax.xml.xpath.XPathFactory; - -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.opennebula.client.Client; -import org.opennebula.client.OneResponse; -import org.opennebula.client.OneSystem; -import org.opennebula.client.user.User; -import org.opennebula.client.user.UserPool; -import org.opennebula.client.group.Group; -import org.w3c.dom.Node; - -public class UserTest -{ - - private static User user; - private static UserPool userPool; - - private static Client client; - - private static OneResponse res; - private static String name = "new_test_user"; - private static String password = "new_test_password"; - - /** - * @throws java.lang.Exception - */ - @BeforeClass - public static void setUpBeforeClass() throws Exception - { - client = new Client(); - userPool = new UserPool(client); - } - - /** - * @throws java.lang.Exception - */ - @AfterClass - public static void tearDownAfterClass() throws Exception - { - } - - /** - * @throws java.lang.Exception - */ - @Before - public void setUp() throws Exception - { - res = User.allocate(client, name, password); - - assertTrue( res.getErrorMessage(), !res.isError() ); - - int uid = Integer.parseInt(res.getMessage()); - user = new User(uid, client); - } - - /** - * @throws java.lang.Exception - */ - @After - public void tearDown() throws Exception - { - user.delete(); - } - - - @Test - public void allocate() - { - userPool.info(); - - boolean found = false; - for(User u : userPool) - { - found = found || u.getName().equals(name); - } - - assertTrue( found ); - } - - @Test - public void allocateInGroup() - { - user.delete(); - - res = Group.allocate(client, "group_a"); - assertTrue( res.getErrorMessage(), !res.isError() ); - int group_a_id = Integer.parseInt(res.getMessage()); - Group group_a = new Group(group_a_id, client); - - res = Group.allocate(client, "group_b"); - assertTrue( res.getErrorMessage(), !res.isError() ); - int group_b_id = Integer.parseInt(res.getMessage()); - Group group_b = new Group(group_b_id, client); - - res = Group.allocate(client, "group_c"); - assertTrue( res.getErrorMessage(), !res.isError() ); - int group_c_id = Integer.parseInt(res.getMessage()); - Group group_c = new Group(group_c_id, client); - - Integer[] gids = {group_b_id, group_a_id}; - res = User.allocate(client, "test_user_in_group", "pass", "", gids); - - assertTrue( res.getErrorMessage(), !res.isError() ); - - user = new User(Integer.parseInt(res.getMessage()), client); - - res = user.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( user.gid() == group_b_id ); - - group_a.info(); - group_b.info(); - group_c.info(); - - assertTrue( group_a.contains(user.id()) ); - assertTrue( group_b.contains(user.id()) ); - assertFalse( group_c.contains(user.id()) ); - } - - @Test - public void info() - { - res = user.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( user.id() >= 0 ); - assertTrue( user.getName().equals(name) ); - } - - @Test - public void attributes() - { - res = user.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( user.xpath("NAME").equals(name) ); - assertTrue( user.xpath("ENABLED").equals("1") ); - } - - @Test - public void chauth() - { - res = user.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( user.xpath("AUTH_DRIVER").equals("core") ); - - res = user.chauth("new_driver", password); - - res = user.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( user.xpath("AUTH_DRIVER").equals("new_driver") ); - } - - @Test - public void update() - { - String new_template = "ATT2 = NEW_VAL\n" + - "ATT3 = VAL3"; - - res = user.update(new_template); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = user.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - assertTrue( user.xpath("TEMPLATE/ATT1").equals( "" ) ); - assertTrue( user.xpath("TEMPLATE/ATT2").equals( "NEW_VAL" ) ); - assertTrue( user.xpath("TEMPLATE/ATT3").equals( "VAL3" ) ); - } - - @Test - public void delete() - { - res = user.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - assertTrue( user.isEnabled() ); - - res = user.delete(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = user.info(); - assertTrue( res.getErrorMessage(), res.isError() ); - } - - @Test - public void defaultqutoas() - { - OneSystem system = new OneSystem(client); - - res = system.getUserQuotas(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = system.setUserQuotas("VM = [ VMS = 7, MEMORY = 0, CPU = 3, SYSTEM_DISK_SIZE = 1 ]"); - assertTrue( res.getErrorMessage(), !res.isError() ); - - Node node = system.getUserQuotasXML(); - XPathFactory factory = XPathFactory.newInstance(); - XPath xpath = factory.newXPath(); - - try - { - assertTrue( xpath.evaluate("VM_QUOTA/VM/VMS", node).equals("7") ); - } catch (XPathExpressionException e) - { - assertTrue(e.getMessage(), false); - } - } -} diff --git a/src/oca/java/test/VMGroupTest.java b/src/oca/java/test/VMGroupTest.java deleted file mode 100644 index b3c6c140fe..0000000000 --- a/src/oca/java/test/VMGroupTest.java +++ /dev/null @@ -1,266 +0,0 @@ -/******************************************************************************* - * Copyright 2002-2017, OpenNebula Project, OpenNebula Systems - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - ******************************************************************************/ -import static org.junit.Assert.assertTrue; - -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.opennebula.client.Client; -import org.opennebula.client.OneResponse; -import org.opennebula.client.group.Group; -import org.opennebula.client.vmgroup.*; -import org.opennebula.client.user.User; - - - - -public class VMGroupTest -{ - - private static VMGroup vmg; - private static VMGroupPool pool; - - private static Client client; - - private static OneResponse res; - private static String name = "new_test_vmg"; - - - private static String template_str = - "NAME = \"" + name + "\"\n" + - "DESCRIPTION = \"test vmgroup\"\n"+ - "ATT1 = \"VAL1\"\n" + - "ATT2 = \"VAL2\""; - - /** - * @throws java.lang.Exception - */ - @BeforeClass - public static void setUpBeforeClass() throws Exception - { - client = new Client(); - pool = new VMGroupPool(client); - } - - /** - * @throws java.lang.Exception - */ - @AfterClass - public static void tearDownAfterClass() throws Exception - { - } - - /** - * @throws java.lang.Exception - */ - @Before - public void setUp() throws Exception - { - res = VMGroup.allocate(client, template_str); - - int oid = res.isError() ? -1 : Integer.parseInt(res.getMessage()); - vmg = new VMGroup(oid, client); - } - - /** - * @throws java.lang.Exception - */ - @After - public void tearDown() throws Exception - { - vmg.delete(); - } - - @Test - public void allocate() - { - vmg.delete(); - - res = VMGroup.allocate(client, template_str); - assertTrue( res.getErrorMessage(), !res.isError() ); - - int oid = res.isError() ? -1 : Integer.parseInt(res.getMessage()); - vmg = new VMGroup(oid, client); - - - pool.info(); - - boolean found = false; - for(VMGroup temp : pool) - { - found = found || temp.getName().equals(name); - } - - assertTrue( found ); - } - - @Test - public void info() - { - res = vmg.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( vmg.getName().equals(name) ); - } - - @Test - public void update() - { - res = vmg.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( vmg.xpath("TEMPLATE/ATT1").equals( "VAL1" ) ); - assertTrue( vmg.xpath("TEMPLATE/ATT2").equals( "VAL2" ) ); - - String new_vmg = "ATT2 = NEW_VAL\n" + - "ATT3 = VAL3"; - - res = vmg.update(new_vmg); - assertTrue( res.getErrorMessage(), !res.isError() ); - - - res = vmg.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - assertTrue( vmg.xpath("TEMPLATE/ATT1").equals( "" ) ); - assertTrue( vmg.xpath("TEMPLATE/ATT2").equals( "NEW_VAL" ) ); - assertTrue( vmg.xpath("TEMPLATE/ATT3").equals( "VAL3" ) ); - } - - @Test - public void chmod() - { - res = vmg.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - String owner_a = vmg.xpath("PERMISSIONS/OWNER_A"); - String group_a = vmg.xpath("PERMISSIONS/GROUP_A"); - - res = vmg.chmod(0, 1, -1, 1, 0, -1, 1, 1, 0); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = vmg.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( vmg.xpath("PERMISSIONS/OWNER_U").equals("0") ); - assertTrue( vmg.xpath("PERMISSIONS/OWNER_M").equals("1") ); - assertTrue( vmg.xpath("PERMISSIONS/OWNER_A").equals(owner_a) ); - assertTrue( vmg.xpath("PERMISSIONS/GROUP_U").equals("1") ); - assertTrue( vmg.xpath("PERMISSIONS/GROUP_M").equals("0") ); - assertTrue( vmg.xpath("PERMISSIONS/GROUP_A").equals(group_a) ); - assertTrue( vmg.xpath("PERMISSIONS/OTHER_U").equals("1") ); - assertTrue( vmg.xpath("PERMISSIONS/OTHER_M").equals("1") ); - assertTrue( vmg.xpath("PERMISSIONS/OTHER_A").equals("0") ); - } - - @Test - public void chmod_octet() - { - res = vmg.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = vmg.chmod(640); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = vmg.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( vmg.xpath("PERMISSIONS/OWNER_U").equals("1") ); - assertTrue( vmg.xpath("PERMISSIONS/OWNER_M").equals("1") ); - assertTrue( vmg.xpath("PERMISSIONS/OWNER_A").equals("0") ); - assertTrue( vmg.xpath("PERMISSIONS/GROUP_U").equals("1") ); - assertTrue( vmg.xpath("PERMISSIONS/GROUP_M").equals("0") ); - assertTrue( vmg.xpath("PERMISSIONS/GROUP_A").equals("0") ); - assertTrue( vmg.xpath("PERMISSIONS/OTHER_U").equals("0") ); - assertTrue( vmg.xpath("PERMISSIONS/OTHER_M").equals("0") ); - assertTrue( vmg.xpath("PERMISSIONS/OTHER_A").equals("0") ); - - res = vmg.chmod("147"); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = vmg.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( vmg.xpath("PERMISSIONS/OWNER_U").equals("0") ); - assertTrue( vmg.xpath("PERMISSIONS/OWNER_M").equals("0") ); - assertTrue( vmg.xpath("PERMISSIONS/OWNER_A").equals("1") ); - assertTrue( vmg.xpath("PERMISSIONS/GROUP_U").equals("1") ); - assertTrue( vmg.xpath("PERMISSIONS/GROUP_M").equals("0") ); - assertTrue( vmg.xpath("PERMISSIONS/GROUP_A").equals("0") ); - assertTrue( vmg.xpath("PERMISSIONS/OTHER_U").equals("1") ); - assertTrue( vmg.xpath("PERMISSIONS/OTHER_M").equals("1") ); - assertTrue( vmg.xpath("PERMISSIONS/OTHER_A").equals("1") ); - } - - @Test - public void attributes() - { - res = vmg.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - -// assertTrue( vmg.xpath("ID").equals("0") ); - assertTrue( vmg.xpath("NAME").equals(name) ); - } - - @Test - public void delete() - { - res = vmg.delete(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = vmg.info(); - assertTrue( res.isError() ); - } - - @Test - public void chown() - { - // Create a new User and Group - res = User.allocate(client, "vmg_test_user", "password"); - assertTrue( res.getErrorMessage(), !res.isError() ); - - int uid = Integer.parseInt(res.getMessage()); - - res = Group.allocate(client, "vmg_test_group"); - assertTrue( res.getErrorMessage(), !res.isError() ); - - int gid = Integer.parseInt(res.getMessage()); - - res = vmg.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( vmg.uid() == 0 ); - assertTrue( vmg.gid() == 0 ); - - res = vmg.chown(uid, gid); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = vmg.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( vmg.uid() == uid ); - assertTrue( vmg.gid() == gid ); - - res = vmg.chgrp(0); - - res = vmg.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( vmg.uid() == uid ); - assertTrue( vmg.gid() == 0 ); - } -} diff --git a/src/oca/java/test/VdcTest.java b/src/oca/java/test/VdcTest.java deleted file mode 100644 index 284e5473c9..0000000000 --- a/src/oca/java/test/VdcTest.java +++ /dev/null @@ -1,194 +0,0 @@ -/******************************************************************************* - * Copyright 2002-2017, OpenNebula Project, OpenNebula Systems - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - ******************************************************************************/ -import static org.junit.Assert.assertTrue; - -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.opennebula.client.Client; -import org.opennebula.client.OneResponse; -import org.opennebula.client.vdc.*; -import org.opennebula.client.group.*; -import org.opennebula.client.cluster.*; - - -public class VdcTest -{ - - private static Vdc vdc; - private static VdcPool vdcPool; - - private static Client client; - - private static OneResponse res; - private static int cont = 0; - - private static String template() - { - cont++; - - return "NAME = \"test_vdc_" + cont + "\"\n" + - "ATT1 = \"VAL1\"\n" + - "ATT2 = \"VAL2\""; - } - - /** - * @throws java.lang.Exception - */ - @BeforeClass - public static void setUpBeforeClass() throws Exception - { - client = new Client(); - vdcPool = new VdcPool(client); - - Group.allocate(client, "testgroup"); - Cluster.allocate(client, "testcluster"); - } - - /** - * @throws java.lang.Exception - */ - @AfterClass - public static void tearDownAfterClass() throws Exception - { - } - - /** - * @throws java.lang.Exception - */ - @Before - public void setUp() throws Exception - { - res = Vdc.allocate(client, template()); - - int vdcid = res.isError() ? -1 : Integer.parseInt(res.getMessage()); - vdc = new Vdc(vdcid, client); - } - - /** - * @throws java.lang.Exception - */ - @After - public void tearDown() throws Exception - { - vdc.delete(); - } - - @Test - public void allocate() - { - vdc.delete(); - - res = Vdc.allocate(client, template()); - assertTrue( res.getErrorMessage(), !res.isError() ); - - int vdcid = res.isError() ? -1 : Integer.parseInt(res.getMessage()); - vdc = new Vdc(vdcid, client); - - - res = vdcPool.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - boolean found = false; - for(Vdc vdc : vdcPool) - { - found = found || vdc.getName().equals("test_vdc_"+cont); - } - - assertTrue( found ); - } - - @Test - public void info() - { - res = vdc.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - -// assertTrue( vdc.getId().equals("0") ); -// assertTrue( vdc.id() == 0 ); - assertTrue( vdc.getName().equals("test_vdc_"+cont) ); - } - - @Test - public void update() - { - res = vdc.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( vdc.xpath("TEMPLATE/ATT1").equals( "VAL1" ) ); - assertTrue( vdc.xpath("TEMPLATE/ATT2").equals( "VAL2" ) ); - - String new_template = "ATT2 = NEW_VAL\n" + - "ATT3 = VAL3"; - - res = vdc.update(new_template); - assertTrue( res.getErrorMessage(), !res.isError() ); - - - res = vdc.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - assertTrue( vdc.xpath("TEMPLATE/ATT1").equals( "" ) ); - assertTrue( vdc.xpath("TEMPLATE/ATT2").equals( "NEW_VAL" ) ); - assertTrue( vdc.xpath("TEMPLATE/ATT3").equals( "VAL3" ) ); - } - - @Test - public void attributes() - { - res = vdc.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - -// assertTrue( vdc.xpath("ID").equals("0") ); - assertTrue( vdc.xpath("NAME").equals("test_vdc_"+cont) ); - } - - @Test - public void addGroup() - { - res = vdc.addGroup(100); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = vdc.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( vdc.xpath("GROUPS/ID").equals("100") ); - } - - @Test - public void addCluster() - { - res = vdc.addCluster(0, 100); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = vdc.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( vdc.xpath("CLUSTERS/CLUSTER/ZONE_ID").equals("0") ); - assertTrue( vdc.xpath("CLUSTERS/CLUSTER/CLUSTER_ID").equals("100") ); - } - - @Test - public void delete() - { - res = vdc.delete(); - assertTrue( res.getErrorMessage(), !res.isError() ); - -// res = vdc.info(); -// assertTrue( res.isError() ); - } -} diff --git a/src/oca/java/test/VirtualMachineTest.java b/src/oca/java/test/VirtualMachineTest.java deleted file mode 100644 index 17d63d4a39..0000000000 --- a/src/oca/java/test/VirtualMachineTest.java +++ /dev/null @@ -1,361 +0,0 @@ -/******************************************************************************* - * Copyright 2002-2017, OpenNebula Project, OpenNebula Systems - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - ******************************************************************************/ -import static org.junit.Assert.assertTrue; - -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.opennebula.client.Client; -import org.opennebula.client.OneResponse; -import org.opennebula.client.datastore.Datastore; -import org.opennebula.client.host.Host; -import org.opennebula.client.image.Image; -import org.opennebula.client.vm.VirtualMachine; -import org.opennebula.client.vm.VirtualMachinePool; - - -public class VirtualMachineTest -{ - - private static VirtualMachine vm; - private static VirtualMachinePool vmPool; - - private static Client client; - - private static int hid_A, hid_B; - - private static OneResponse res; - private static String name = "new_test_machine"; - - - /** - * Wait until the VM changes to the specified state. - * There is a time-out of 10 seconds. - */ - void waitAssert(VirtualMachine vm, String state, String lcmState) - { - int n_steps = 100; - int step = 100; - - int i = 0; - - vm.info(); - - while( !( (vm.stateStr().equals(state) && (!state.equals("ACTIVE") || vm.lcmStateStr().equals(lcmState) ))|| i > n_steps )) - { - try{ Thread.sleep(step); } catch (Exception e){} - - vm.info(); - i++; - } - - assertTrue( vm.stateStr().equals(state) ); - if(state.equals("ACTIVE")) - { - assertTrue( vm.lcmStateStr().equals(lcmState) ); - } - } - - /** - * @throws java.lang.Exception - */ - @BeforeClass - public static void setUpBeforeClass() throws Exception - { - client = new Client(); - vmPool = new VirtualMachinePool(client); - - - res = Host.allocate(client, "host_A", - "dummy", "dummy"); - hid_A = Integer.parseInt( res.getMessage() ); - - res = Host.allocate(client, "host_B", - "dummy", "dummy"); - hid_B = Integer.parseInt( res.getMessage() ); - - Datastore systemDs = new Datastore(0, client); - systemDs.update("TM_MAD = dummy"); - } - - /** - * @throws java.lang.Exception - */ - @AfterClass - public static void tearDownAfterClass() throws Exception - { - } - - /** - * @throws java.lang.Exception - */ - @Before - public void setUp() throws Exception - { - String template = "NAME = " + name + "\n"+ - "MEMORY = 512\n" + - "CPU = 1\n" + - "CONTEXT = [DNS = 192.169.1.4]"; - - res = VirtualMachine.allocate(client, template); - int vmid = !res.isError() ? Integer.parseInt(res.getMessage()) : -1; - - vm = new VirtualMachine(vmid, client); - } - - /** - * @throws java.lang.Exception - */ - @After - public void tearDown() throws Exception - { - vm.recover(3); - waitAssert(vm, "DONE", "-"); - - vm = null; - } - - @Test - public void allocate() - { - res = vmPool.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - boolean found = false; - for(VirtualMachine vm : vmPool) - { - found = found || vm.getName().equals(name); - } - - assertTrue( found ); - } - - @Test - public void update() - { - res = vm.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( vm.getName().equals(name) ); - } - - @Test - public void hold() - { - res = vm.hold(); - assertTrue( res.getErrorMessage(), !res.isError() ); - waitAssert(vm, "HOLD", "-"); - } - - @Test - public void release() - { - vm.hold(); - - res = vm.release(); - assertTrue( res.getErrorMessage(), !res.isError() ); - waitAssert(vm, "PENDING", "-"); - } - - @Test - public void deploy() - { - res = vm.deploy(hid_A); - assertTrue( res.getErrorMessage(), !res.isError() ); - waitAssert(vm, "ACTIVE", "RUNNING"); - } - - @Test - public void migrate() - { - vm.deploy(hid_A); - waitAssert(vm, "ACTIVE", "RUNNING"); - - res = vm.migrate(hid_B); - assertTrue( res.getErrorMessage(), !res.isError() ); - waitAssert(vm, "ACTIVE", "RUNNING"); - } - - @Test - public void liveMigrate() - { - vm.deploy(hid_A); - waitAssert(vm, "ACTIVE", "RUNNING"); - - res = vm.migrate(hid_B, true); - assertTrue( res.getErrorMessage(), !res.isError() ); - waitAssert(vm, "ACTIVE", "RUNNING"); - } - - @Test - public void terminate() - { - vm.deploy(hid_A); - waitAssert(vm, "ACTIVE", "RUNNING"); - - res = vm.terminate(); - assertTrue( res.getErrorMessage(), !res.isError() ); - waitAssert(vm, "DONE", "-"); - } - - @Test - public void terminatehard() - { - vm.deploy(hid_A); - waitAssert(vm, "ACTIVE", "RUNNING"); - - res = vm.terminate(true); - assertTrue( res.getErrorMessage(), !res.isError() ); - waitAssert(vm, "DONE", "-"); - } - - @Test - public void stop() - { - vm.deploy(hid_A); - waitAssert(vm, "ACTIVE", "RUNNING"); - - res = vm.stop(); - assertTrue( res.getErrorMessage(), !res.isError() ); - waitAssert(vm, "STOPPED", "-"); - } - - @Test - public void suspend() - { - vm.deploy(hid_A); - waitAssert(vm, "ACTIVE", "RUNNING"); - - res = vm.suspend(); - assertTrue( res.getErrorMessage(), !res.isError() ); - waitAssert(vm, "SUSPENDED", "-"); - } - - @Test - public void resume() - { - vm.deploy(hid_A); - waitAssert(vm, "ACTIVE", "RUNNING"); - - vm.suspend(); - waitAssert(vm, "SUSPENDED", "-"); - - res = vm.resume(); - assertTrue( res.getErrorMessage(), !res.isError() ); - waitAssert(vm, "ACTIVE", "RUNNING"); - } - - @Test - public void delete() - { - vm.deploy(hid_A); - waitAssert(vm, "ACTIVE", "RUNNING"); - res = vm.recover(3); - - assertTrue( res.getErrorMessage(), !res.isError() ); - waitAssert(vm, "DONE", "-"); - } - - @Test - public void restart() - { - // TODO - } - - @Test - public void deleteRecreate() - { - vm.deploy(hid_A); - waitAssert(vm, "ACTIVE", "RUNNING"); - res = vm.recover(4); - - assertTrue( res.getErrorMessage(), !res.isError() ); - waitAssert(vm, "PENDING", "-"); - } - - @Test - public void attributes() - { - res = vm.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( vm.xpath("NAME").equals(name) ); - assertTrue( vm.xpath("TEMPLATE/MEMORY").equals("512") ); -// assertTrue( vm.xpath("ID").equals("0") ); - assertTrue( vm.xpath("TEMPLATE/MEMORY").equals("512") ); - assertTrue( vm.xpath("TEMPLATE/CONTEXT/DNS").equals("192.169.1.4") ); - } - - // TODO -/* - @Test - public void savedisk() - { - String img_template = - "NAME = \"test_img\"\n" + - "PATH = /etc/hosts\n" + - "ATT1 = \"VAL1\"\n" + - "ATT2 = \"VAL2\""; - - res = Image.allocate(client, img_template, 1); - assertTrue( res.getErrorMessage(), !res.isError() ); - - int imgid = Integer.parseInt(res.getMessage()); - - Image img = new Image(imgid, client); - ImageTest.waitAssert(img, "READY"); - - - String template = "NAME = savedisk_vm\n"+ - "MEMORY = 512\n" + - "CPU = 1\n" + - "CONTEXT = [DNS = 192.169.1.4]\n" + - "DISK = [ IMAGE = test_img ]"; - - res = VirtualMachine.allocate(client, template); - assertTrue( res.getErrorMessage(), !res.isError() ); - - int vmid = !res.isError() ? Integer.parseInt(res.getMessage()) : -1; - - vm = new VirtualMachine(vmid, client); - - res = vm.deploy(hid_A); - assertTrue( res.getErrorMessage(), !res.isError() ); - - waitAssert(vm, "ACTIVE", "RUNNING"); - - res = vm.savedisk(0, "New_image"); - assertTrue( res.getErrorMessage(), !res.isError() ); - - int new_imgid = Integer.parseInt(res.getMessage()); - assertTrue( new_imgid == imgid+1 ); - - res = vm.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - } -*/ - @Test - public void resize() - { - res = vm.resize("CPU = 2.5\nMEMORY = 512\nVCPU = 0", true); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = vm.resize("CPU = 1\nMEMORY = 128\nVCPU = 2", false); - assertTrue( res.getErrorMessage(), !res.isError() ); - } -} diff --git a/src/oca/java/test/VirtualNetworkTest.java b/src/oca/java/test/VirtualNetworkTest.java deleted file mode 100644 index 3d3a492056..0000000000 --- a/src/oca/java/test/VirtualNetworkTest.java +++ /dev/null @@ -1,234 +0,0 @@ -/******************************************************************************* - * Copyright 2002-2017, OpenNebula Project, OpenNebula Systems - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - ******************************************************************************/ -import static org.junit.Assert.assertTrue; - -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.opennebula.client.Client; -import org.opennebula.client.OneResponse; -import org.opennebula.client.vnet.VirtualNetwork; -import org.opennebula.client.vnet.VirtualNetworkPool; - -public class VirtualNetworkTest -{ - - private static VirtualNetwork vnet; - private static VirtualNetworkPool vnetPool; - - private static Client client; - - private static OneResponse res; - private static String name = "new_test_vnet"; - - - private static String template = - "NAME = " + name + "\n"+ - "BRIDGE = vbr0\n" + - "VN_MAD = dummy\n" + - "NETWORK_ADDRESS = 192.168.0.0\n"+ - "AR = [ TYPE = IP4, IP = 192.168.0.1, SIZE = 254 ]\n"; - - private static String second_template = - "NAME = \"Net number one\"\n" + - "BRIDGE = br1\n" + - "VN_MAD = dummy\n" + - "AR = [ TYPE = IP4, IP=130.10.0.1, SIZE = 1]"; - - /** - * @throws java.lang.Exception - */ - @BeforeClass - public static void setUpBeforeClass() throws Exception - { - client = new Client(); - vnetPool = new VirtualNetworkPool(client); - } - - /** - * @throws java.lang.Exception - */ - @AfterClass - public static void tearDownAfterClass() throws Exception - { - } - - /** - * @throws java.lang.Exception - */ - @Before - public void setUp() throws Exception - { - res = VirtualNetwork.allocate(client, template); - - assertTrue( res.getErrorMessage(), !res.isError() ); - - int vnid = !res.isError() ? Integer.parseInt(res.getMessage()) : -1; - vnet = new VirtualNetwork(vnid, client); - } - - /** - * @throws java.lang.Exception - */ - @After - public void tearDown() throws Exception - { - vnet.delete(); - } - - - @Test - public void allocate() - { - vnetPool.info(); - - boolean found = false; - for(VirtualNetwork vn : vnetPool) - { - found = found || vn.getName().equals(name); - } - - assertTrue( found ); - } - - @Test - public void info() - { - res = vnet.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - assertTrue( vnet.getName().equals(name) ); - } - - @Test - public void attributes() - { - res = vnet.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( vnet.xpath("NAME").equals(name) ); - assertTrue( vnet.xpath("BRIDGE").equals("vbr0") ); - } - - @Test - public void delete() - { - res = vnet.delete(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = vnet.info(); - assertTrue( res.isError() ); - } - - @Test - public void addAr() - { - res = VirtualNetwork.allocate(client, second_template); - assertTrue( res.getErrorMessage(), !res.isError() ); - - VirtualNetwork second_vnet = - new VirtualNetwork(Integer.parseInt(res.getMessage()), client); - - res = second_vnet.addAr("AR = [IP = 130.10.0.5, SIZE = 1, TYPE = IP4]"); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = second_vnet.addAr("AR = [IP = 130.10.0.6, MAC = 50:20:20:20:20:20, SIZE = 1, TYPE = IP4]"); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = second_vnet.addAr("130.10.0.6"); - assertTrue( res.isError() ); - - second_vnet.delete(); - } - - @Test - public void rmAr() - { - res = VirtualNetwork.allocate(client, second_template); - assertTrue( res.getErrorMessage(), !res.isError() ); - - VirtualNetwork second_vnet = - new VirtualNetwork(Integer.parseInt(res.getMessage()), client); - - res = second_vnet.rmAr(0); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = second_vnet.rmAr(0); - assertTrue( res.isError() ); - - second_vnet.delete(); - } - - @Test - public void updateAr() - { - String new_template = - "AR = [ AR_ID = 0, ATT2 = NEW_VAL, ATT3 = VAL3 ]"; - - res = vnet.updateAr(new_template); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = vnet.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - assertTrue( vnet.xpath("AR_POOL/AR[AR_ID=0]/ATT1").equals( "" ) ); - assertTrue( vnet.xpath("AR_POOL/AR[AR_ID=0]/ATT2").equals( "NEW_VAL" ) ); - assertTrue( vnet.xpath("AR_POOL/AR[AR_ID=0]/ATT3").equals( "VAL3" ) ); - } - - @Test - public void hold() - { - res = vnet.hold("192.168.0.10"); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = vnet.hold("192.168.0.11", 0); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = vnet.hold("192.168.100.1"); - assertTrue( res.isError() ); - - res = vnet.release("192.168.0.10"); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = vnet.release("192.168.0.11", 0); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = vnet.release("192.168.0.10"); - assertTrue( res.getErrorMessage(), !res.isError() ); - - vnet.delete(); - } - - @Test - public void update() - { - String new_template = "ATT2 = NEW_VAL\n" + - "ATT3 = VAL3"; - - res = vnet.update(new_template); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = vnet.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - assertTrue( vnet.xpath("TEMPLATE/ATT1").equals( "" ) ); - assertTrue( vnet.xpath("TEMPLATE/ATT2").equals( "NEW_VAL" ) ); - assertTrue( vnet.xpath("TEMPLATE/ATT3").equals( "VAL3" ) ); - } - - // TODO: reserve, free - -} diff --git a/src/oca/java/test/VirtualRouterTest.java b/src/oca/java/test/VirtualRouterTest.java deleted file mode 100644 index c0e5cac40a..0000000000 --- a/src/oca/java/test/VirtualRouterTest.java +++ /dev/null @@ -1,294 +0,0 @@ -/******************************************************************************* - * Copyright 2002-2017, OpenNebula Project, OpenNebula Systems - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - ******************************************************************************/ -import static org.junit.Assert.assertTrue; - -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.opennebula.client.Client; -import org.opennebula.client.OneResponse; -import org.opennebula.client.group.Group; -import org.opennebula.client.template.*; -import org.opennebula.client.vrouter.*; -import org.opennebula.client.vm.*; -import org.opennebula.client.user.User; -import org.opennebula.client.vm.VirtualMachine; - - - -public class VirtualRouterTest -{ - private static VirtualRouter vrouter; - private static VirtualRouterPool vrouterPool; - - private static Client client; - - private static OneResponse res; - private static String name = "new_test_vrouter"; - - - private static String template_str = - "NAME = \"" + name + "\"\n" + - "VROUTER = YES\n" + - "ATT1 = \"VAL1\"\n" + - "ATT2 = \"VAL2\""; - - /** - * @throws java.lang.Exception - */ - @BeforeClass - public static void setUpBeforeClass() throws Exception - { - client = new Client(); - vrouterPool = new VirtualRouterPool(client); - } - - /** - * @throws java.lang.Exception - */ - @AfterClass - public static void tearDownAfterClass() throws Exception - { - } - - /** - * @throws java.lang.Exception - */ - @Before - public void setUp() throws Exception - { - res = VirtualRouter.allocate(client, template_str); - - int oid = res.isError() ? -1 : Integer.parseInt(res.getMessage()); - vrouter = new VirtualRouter(oid, client); - } - - /** - * @throws java.lang.Exception - */ - @After - public void tearDown() throws Exception - { - vrouter.delete(); - } - - @Test - public void allocate() - { - vrouter.delete(); - - res = VirtualRouter.allocate(client, template_str); - assertTrue( res.getErrorMessage(), !res.isError() ); - - int oid = res.isError() ? -1 : Integer.parseInt(res.getMessage()); - vrouter = new VirtualRouter(oid, client); - - - res = vrouterPool.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - boolean found = false; - for(VirtualRouter temp : vrouterPool) - { - found = found || temp.getName().equals(name); - } - - assertTrue( found ); - } - - @Test - public void info() - { - res = vrouter.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( vrouter.getName().equals(name) ); - } - - @Test - public void publish() - { - res = vrouter.publish(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - vrouter.info(); - assertTrue( vrouter.xpath("PERMISSIONS/GROUP_U").equals("1") ); - } - - @Test - public void unpublish() - { - res = vrouter.unpublish(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - vrouter.info(); - assertTrue( vrouter.xpath("PERMISSIONS/GROUP_U").equals("0") ); - } - - @Test - public void chmod() - { - res = vrouter.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - String owner_a = vrouter.xpath("PERMISSIONS/OWNER_A"); - String group_a = vrouter.xpath("PERMISSIONS/GROUP_A"); - - res = vrouter.chmod(0, 1, -1, 1, 0, -1, 1, 1, 0); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = vrouter.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( vrouter.xpath("PERMISSIONS/OWNER_U").equals("0") ); - assertTrue( vrouter.xpath("PERMISSIONS/OWNER_M").equals("1") ); - assertTrue( vrouter.xpath("PERMISSIONS/OWNER_A").equals(owner_a) ); - assertTrue( vrouter.xpath("PERMISSIONS/GROUP_U").equals("1") ); - assertTrue( vrouter.xpath("PERMISSIONS/GROUP_M").equals("0") ); - assertTrue( vrouter.xpath("PERMISSIONS/GROUP_A").equals(group_a) ); - assertTrue( vrouter.xpath("PERMISSIONS/OTHER_U").equals("1") ); - assertTrue( vrouter.xpath("PERMISSIONS/OTHER_M").equals("1") ); - assertTrue( vrouter.xpath("PERMISSIONS/OTHER_A").equals("0") ); - } - - @Test - public void chmod_octet() - { - res = vrouter.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = vrouter.chmod(640); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = vrouter.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( vrouter.xpath("PERMISSIONS/OWNER_U").equals("1") ); - assertTrue( vrouter.xpath("PERMISSIONS/OWNER_M").equals("1") ); - assertTrue( vrouter.xpath("PERMISSIONS/OWNER_A").equals("0") ); - assertTrue( vrouter.xpath("PERMISSIONS/GROUP_U").equals("1") ); - assertTrue( vrouter.xpath("PERMISSIONS/GROUP_M").equals("0") ); - assertTrue( vrouter.xpath("PERMISSIONS/GROUP_A").equals("0") ); - assertTrue( vrouter.xpath("PERMISSIONS/OTHER_U").equals("0") ); - assertTrue( vrouter.xpath("PERMISSIONS/OTHER_M").equals("0") ); - assertTrue( vrouter.xpath("PERMISSIONS/OTHER_A").equals("0") ); - - res = vrouter.chmod("147"); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = vrouter.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( vrouter.xpath("PERMISSIONS/OWNER_U").equals("0") ); - assertTrue( vrouter.xpath("PERMISSIONS/OWNER_M").equals("0") ); - assertTrue( vrouter.xpath("PERMISSIONS/OWNER_A").equals("1") ); - assertTrue( vrouter.xpath("PERMISSIONS/GROUP_U").equals("1") ); - assertTrue( vrouter.xpath("PERMISSIONS/GROUP_M").equals("0") ); - assertTrue( vrouter.xpath("PERMISSIONS/GROUP_A").equals("0") ); - assertTrue( vrouter.xpath("PERMISSIONS/OTHER_U").equals("1") ); - assertTrue( vrouter.xpath("PERMISSIONS/OTHER_M").equals("1") ); - assertTrue( vrouter.xpath("PERMISSIONS/OTHER_A").equals("1") ); - } - - @Test - public void attributes() - { - res = vrouter.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( vrouter.xpath("NAME").equals(name) ); - } - - @Test - public void delete() - { - res = vrouter.delete(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = vrouter.info(); - assertTrue( res.isError() ); - } - - @Test - public void chown() - { - // Create a new User and Group - res = User.allocate(client, "template_test_user", "password"); - assertTrue( res.getErrorMessage(), !res.isError() ); - - int uid = Integer.parseInt(res.getMessage()); - - res = Group.allocate(client, "template_test_group"); - assertTrue( res.getErrorMessage(), !res.isError() ); - - int gid = Integer.parseInt(res.getMessage()); - - res = vrouter.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( vrouter.uid() == 0 ); - assertTrue( vrouter.gid() == 0 ); - - res = vrouter.chown(uid, gid); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = vrouter.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( vrouter.uid() == uid ); - assertTrue( vrouter.gid() == gid ); - - res = vrouter.chgrp(0); - - res = vrouter.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( vrouter.uid() == uid ); - assertTrue( vrouter.gid() == 0 ); - } - - @Test - public void instantiate() - { - VirtualMachinePool vmPool = new VirtualMachinePool(client); - - res = vmPool.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( vmPool.getLength() == 0 ); - - String tmpl_str = - "NAME = vrtemplate\n"+ - "CPU = 0.1\n"+ - "VROUTER = YES\n"+ - "MEMORY = 64\n"; - - res = Template.allocate(client, tmpl_str); - assertTrue( res.getErrorMessage(), !res.isError() ); - - int tmplid = Integer.parseInt(res.getMessage()); - - res = vrouter.instantiate(3, tmplid); - assertTrue( res.getErrorMessage(), !res.isError() ); - - res = vmPool.info(); - assertTrue( res.getErrorMessage(), !res.isError() ); - - assertTrue( vmPool.getLength() == 3 ); - } -} diff --git a/src/oca/java/test/all_tests.sh b/src/oca/java/test/all_tests.sh deleted file mode 100755 index d0ad6a0be9..0000000000 --- a/src/oca/java/test/all_tests.sh +++ /dev/null @@ -1,89 +0,0 @@ -#!/bin/bash - -# -------------------------------------------------------------------------- # -# Copyright 2002-2017, OpenNebula Project, OpenNebula Systems # -# # -# Licensed under the Apache License, Version 2.0 (the "License"); you may # -# not use this file except in compliance with the License. You may obtain # -# a copy of the License at # -# # -# http://www.apache.org/licenses/LICENSE-2.0 # -# # -# Unless required by applicable law or agreed to in writing, software # -# distributed under the License is distributed on an "AS IS" BASIS, # -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -# See the License for the specific language governing permissions and # -# limitations under the License. # -#--------------------------------------------------------------------------- # - -if [ -z $ONE_LOCATION ]; then - ONEDCONF_LOCATION="/etc/one/oned.conf" -else - ONEDCONF_LOCATION="$ONE_LOCATION/etc/oned.conf" -fi - -if [ -f $ONEDCONF_LOCATION ]; then - echo "$ONEDCONF_LOCATION has to be overwritten, move it to a safe place." - exit -1 -fi - -if [ -z $ONE_LOCATION ]; then - sudo cp oned.conf $ONEDCONF_LOCATION -else - cp oned.conf $ONEDCONF_LOCATION -fi - -export ONE_XMLRPC=http://localhost:2633/RPC2 - -RC=0 - -LOG_FILE="/tmp/one-java-test.txt" - -rm $LOG_FILE - -./test.sh HostTest 2>&1 | tee -a $LOG_FILE -let RC=RC+$? - -./test.sh ImageTest 2>&1 | tee -a $LOG_FILE -let RC=RC+$? - -./test.sh SessionTest 2>&1 | tee -a $LOG_FILE -let RC=RC+$? - -./test.sh UserTest 2>&1 | tee -a $LOG_FILE -let RC=RC+$? - -./test.sh VirtualMachineTest 2>&1 | tee -a $LOG_FILE -let RC=RC+$? - -./test.sh VirtualNetworkTest 2>&1 | tee -a $LOG_FILE -let RC=RC+$? - -./test.sh TemplateTest 2>&1 | tee -a $LOG_FILE -let RC=RC+$? - -./test.sh GroupTest 2>&1 | tee -a $LOG_FILE -let RC=RC+$? - -./test.sh AclTest 2>&1 | tee -a $LOG_FILE -let RC=RC+$? - -./test.sh DocumentTest 2>&1 | tee -a $LOG_FILE -let RC=RC+$? - -./test.sh VdcTest 2>&1 | tee -a $LOG_FILE -let RC=RC+$? - -./test.sh SecurityGroupTest 2>&1 | tee -a $LOG_FILE -let RC=RC+$? - -./test.sh VirtualRouterTest 2>&1 | tee -a $LOG_FILE -let RC=RC+$? - -./test.sh VMGroupTest 2>&1 | tee -a $LOG_FILE -let RC=RC+$? - -echo "" -echo "Output saved in $LOG_FILE" - -exit $RC \ No newline at end of file diff --git a/src/oca/java/test/oned.conf b/src/oca/java/test/oned.conf deleted file mode 100644 index 95f732c096..0000000000 --- a/src/oca/java/test/oned.conf +++ /dev/null @@ -1,1011 +0,0 @@ -#******************************************************************************* -# OpenNebula Configuration file -#******************************************************************************* - -#******************************************************************************* -# Daemon configuration attributes -#------------------------------------------------------------------------------- -# MANAGER_TIMER: Time in seconds the core uses to evaluate periodical functions. -# MONITORING_INTERVAL cannot have a smaller value than MANAGER_TIMER. -# -# MONITORING_INTERVAL: Time in seconds between host and VM monitorization. -# -# MONITORING_THREADS: Max. number of threads used to process monitor messages -# -# HOST_PER_INTERVAL: Number of hosts monitored in each interval. -# HOST_MONITORING_EXPIRATION_TIME: Time, in seconds, to expire monitoring -# information. Use 0 to disable HOST monitoring recording. -# -# VM_INDIVIDUAL_MONITORING: VM monitoring information is obtained along with the -# host information. For some custom monitor drivers you may need activate the -# individual VM monitoring process. -# VM_PER_INTERVAL: Number of VMs monitored in each interval, if the individual -# VM monitoring is set to yes. -# VM_MONITORING_EXPIRATION_TIME: Time, in seconds, to expire monitoring -# information. Use 0 to disable VM monitoring recording. -# -# SCRIPTS_REMOTE_DIR: Remote path to store the monitoring and VM management -# scripts. -# -# PORT: Port where oned will listen for xmlrpc calls. -# LISTEN_ADDRESS: Host IP to listen on for xmlrpc calls (default: all IPs). -# -# DB: Configuration attributes for the database backend -# backend : can be sqlite or mysql (default is sqlite) -# server : (mysql) host name or an IP address for the MySQL server -# port : (mysql) port for the connection to the server. -# If set to 0, the default port is used. -# user : (mysql) user's MySQL login ID -# passwd : (mysql) the password for user -# db_name : (mysql) the database name -# -# VNC_PORTS: VNC port pool for automatic VNC port assignment, if possible the -# port will be set to ``START`` + ``VMID`` -# start : first port to assign -# reserved: comma separated list of ports -# -# LOG: Configuration for the logging system -# system: defines the logging system: -# file to log in the oned.log file -# syslog to use the syslog facilities -# std to use the default log stream (stderr) to use with systemd -# debug_level: 0 = ERROR, 1 = WARNING, 2 = INFO, 3 = DEBUG -# -# VM_SUBMIT_ON_HOLD: Forces VMs to be created on hold state instead of pending. -# Values: YES or NO. -#******************************************************************************* - -LOG = [ - SYSTEM = "file", - DEBUG_LEVEL = 3 -] - -#MANAGER_TIMER = 15 - -MONITORING_INTERVAL = 60 -MONITORING_THREADS = 50 - -#HOST_PER_INTERVAL = 15 -#HOST_MONITORING_EXPIRATION_TIME = 43200 - -#VM_INDIVIDUAL_MONITORING = "no" -#VM_PER_INTERVAL = 5 -#VM_MONITORING_EXPIRATION_TIME = 14400 - -SCRIPTS_REMOTE_DIR=/var/tmp/one - -PORT = 2633 - -LISTEN_ADDRESS = "0.0.0.0" - -DB = [ BACKEND = "sqlite" ] - -# Sample configuration for MySQL -# DB = [ BACKEND = "mysql", -# SERVER = "localhost", -# PORT = 0, -# USER = "oneadmin", -# PASSWD = "oneadmin", -# DB_NAME = "opennebula" ] - -VNC_PORTS = [ - START = 5900 -# RESERVED = "6800, 6801, 9869" -] - -#VM_SUBMIT_ON_HOLD = "NO" - -#******************************************************************************* -# Federation configuration attributes -#------------------------------------------------------------------------------- -# Control the federation capabilities of oned. Operation in a federated setup -# requires a special DB configuration. -# -# FEDERATION: Federation attributes -# MODE: Operation mode of this oned. -# STANDALONE no federated.This is the default operational mode -# MASTER this oned is the master zone of the federation -# SLAVE this oned is a slave zone -# ZONE_ID: The zone ID as returned by onezone command -# MASTER_ONED: The xml-rpc endpoint of the master oned, e.g. -# http://master.one.org:2633/RPC2 -#******************************************************************************* - -FEDERATION = [ - MODE = "STANDALONE", - ZONE_ID = 0, - MASTER_ONED = "" -] - -#******************************************************************************* -# Default showback cost -#------------------------------------------------------------------------------- -# The following attributes define the default cost for Virtual Machines that -# don't have a CPU, MEMORY or DISK cost. This is used by the oneshowback -# calculate method. -#******************************************************************************* - -DEFAULT_COST = [ - CPU_COST = 0, - MEMORY_COST = 0, - DISK_COST = 0 -] - -#******************************************************************************* -# XML-RPC server configuration -#------------------------------------------------------------------------------- -# These are configuration parameters for oned's xmlrpc-c server -# -# MAX_CONN: Maximum number of simultaneous TCP connections the server -# will maintain -# -# MAX_CONN_BACKLOG: Maximum number of TCP connections the operating system -# will accept on the server's behalf without the server accepting them from -# the operating system -# -# KEEPALIVE_TIMEOUT: Maximum time in seconds that the server allows a -# connection to be open between RPCs -# -# KEEPALIVE_MAX_CONN: Maximum number of RPCs that the server will execute on -# a single connection -# -# TIMEOUT: Maximum time in seconds the server will wait for the client to -# do anything while processing an RPC. This timeout will be also used when -# proxy calls to the master in a federation. -# -# RPC_LOG: Create a separated log file for xml-rpc requests, in -# "/var/log/one/one_xmlrpc.log". -# -# MESSAGE_SIZE: Buffer size in bytes for XML-RPC responses. -# -# LOG_CALL_FORMAT: Format string to log XML-RPC calls. Interpreted strings: -# %i -- request id -# %m -- method name -# %u -- user id -# %U -- user name -# %l -- param list -# %p -- user password -# %g -- group id -# %G -- group name -# %a -- auth token -# %% -- % -#******************************************************************************* - -#MAX_CONN = 15 -#MAX_CONN_BACKLOG = 15 -#KEEPALIVE_TIMEOUT = 15 -#KEEPALIVE_MAX_CONN = 30 -#TIMEOUT = 15 -#RPC_LOG = NO -#MESSAGE_SIZE = 1073741824 -#LOG_CALL_FORMAT = "Req:%i UID:%u %m invoked %l" - -#******************************************************************************* -# Physical Networks configuration -#******************************************************************************* -# NETWORK_SIZE: Here you can define the default size for the virtual networks -# -# MAC_PREFIX: Default MAC prefix to be used to create the auto-generated MAC -# addresses is defined here (this can be overwritten by the Virtual Network -# template) -# -# VLAN_IDS: VLAN ID pool for the automatic VLAN_ID assignment. This pool -# is for 802.1Q networks (Open vSwitch and 802.1Q drivers). The driver -# will try first to allocate VLAN_IDS[START] + VNET_ID -# start: First VLAN_ID to use -# reserved: Comma separated list of VLAN_IDs -# -# VXLAN_IDS: Automatic VXLAN Network ID (VNI) assignment. This is used -# for vxlan networks. -# start: First VNI to use -# NOTE: reserved is not supported by this pool -#******************************************************************************* - -NETWORK_SIZE = 254 - -MAC_PREFIX = "02:00" - -VLAN_IDS = [ - START = "2", - RESERVED = "0, 1, 4095" -] - -VXLAN_IDS = [ - START = "2" -] - -#******************************************************************************* -# DataStore Configuration -#******************************************************************************* -# DATASTORE_LOCATION: Path for Datastores. It IS the same for all the hosts -# and front-end. It defaults to /var/lib/one/datastores (in self-contained mode -# defaults to $ONE_LOCATION/var/datastores). Each datastore has its own -# directory (called BASE_PATH) in the form: $DATASTORE_LOCATION/ -# You can symlink this directory to any other path if needed. BASE_PATH is -# generated from this attribute each time oned is started. -# -# DATASTORE_CAPACITY_CHECK: Checks that there is enough capacity before -# creating a new image. Defaults to Yes -# -# DEFAULT_IMAGE_TYPE: This can take values -# OS Image file holding an operating system -# CDROM Image file holding a CDROM -# DATABLOCK Image file holding a datablock, created as an empty block -# -# DEFAULT_DEVICE_PREFIX: This can be set to -# hd IDE prefix -# sd SCSI -# vd KVM virtual disk -# -# DEFAULT_CDROM_DEVICE_PREFIX: Same as above but for CDROM devices. -#******************************************************************************* - -#DATASTORE_LOCATION = /var/lib/one/datastores - -DATASTORE_CAPACITY_CHECK = "yes" - -DEFAULT_IMAGE_TYPE = "OS" -DEFAULT_DEVICE_PREFIX = "hd" - -DEFAULT_CDROM_DEVICE_PREFIX = "hd" - -#******************************************************************************* -# Information Driver Configuration -#******************************************************************************* -# You can add more information managers with different configurations but make -# sure it has different names. -# -# name : name for this information manager -# -# executable: path of the information driver executable, can be an -# absolute path or relative to $ONE_LOCATION/lib/mads (or -# /usr/lib/one/mads/ if OpenNebula was installed in /) -# -# arguments : for the driver executable, usually a probe configuration file, -# can be an absolute path or relative to $ONE_LOCATION/etc (or -# /etc/one/ if OpenNebula was installed in /) -#******************************************************************************* - -#------------------------------------------------------------------------------- -# Information Collector for KVM IM's. -#------------------------------------------------------------------------------- -# This driver CANNOT BE ASSIGNED TO A HOST, and needs to be used with KVM -# -h prints this help. -# -a Address to bind the collectd socket (default 0.0.0.0) -# -p UDP port to listen for monitor information (default 4124) -# -f Interval in seconds to flush collected information (default 5) -# -t Number of threads for the server (default 50) -# -i Time in seconds of the monitorization push cycle. This parameter must -# be smaller than MONITORING_INTERVAL, otherwise push monitorization will -# not be effective. -#------------------------------------------------------------------------------- -IM_MAD = [ - NAME = "collectd", - EXECUTABLE = "collectd", - ARGUMENTS = "-p 4124 -f 5 -t 50 -i 20" ] -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# KVM UDP-push Information Driver Manager Configuration -# -r number of retries when monitoring a host -# -t number of threads, i.e. number of hosts monitored at the same time -#------------------------------------------------------------------------------- -IM_MAD = [ - NAME = "kvm", - SUNSTONE_NAME = "KVM", - EXECUTABLE = "one_im_ssh", - ARGUMENTS = "-r 3 -t 15 kvm" ] -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# KVM SSH-pull Information Driver Manager Configuration -# -r number of retries when monitoring a host -# -t number of threads, i.e. number of hosts monitored at the same time -#------------------------------------------------------------------------------- -# IM_MAD = [ -# NAME = "kvm", -# SUNSTONE_NAME = "kvm-ssh", -# EXECUTABLE = "one_im_ssh", -# ARGUMENTS = "-r 3 -t 15 kvm-probes" ] -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# vCenter Information Driver Manager Configuration -# -r number of retries when monitoring a host -# -t number of threads, i.e. number of hosts monitored at the same time -#------------------------------------------------------------------------------- -#IM_MAD = [ -# NAME = "vcenter", -# SUNSTONE_NAME = "VMWare vCenter", -# EXECUTABLE = "one_im_sh", -# ARGUMENTS = "-c -t 15 -r 0 vcenter" ] -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# EC2 Information Driver Manager Configuration -# -r number of retries when monitoring a host -# -t number of threads, i.e. number of hosts monitored at the same time -#------------------------------------------------------------------------------- -#IM_MAD = [ -# NAME = "ec2", -# SUNSTONE_NAME = "Amazon EC2", -# EXECUTABLE = "one_im_sh", -# ARGUMENTS = "-c -t 1 -r 0 ec2" ] -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# Azure Information Driver Manager Configuration -# -r number of retries when monitoring a host -# -t number of threads, i.e. number of hosts monitored at the same time -#------------------------------------------------------------------------------- -#IM_MAD = [ -# NAME = "az", -# SUNSTONE_NAME = "Microsoft Azure", -# EXECUTABLE = "one_im_sh", -# ARGUMENTS = "-c -t 1 -r 0 az" ] -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# Dummy Information Driver Manager Configuration -#------------------------------------------------------------------------------- -#IM_MAD = [ NAME="dummy", SUNSTONE_NAME="Testing", EXECUTABLE="one_im_dummy"] -#------------------------------------------------------------------------------- - -#******************************************************************************* -# Virtualization Driver Configuration -#******************************************************************************* -# You can add more virtualization managers with different configurations but -# make sure it has different names. -# -# name : name of the virtual machine manager driver -# -# executable: path of the virtualization driver executable, can be an -# absolute path or relative to $ONE_LOCATION/lib/mads (or -# /usr/lib/one/mads/ if OpenNebula was installed in /) -# -# arguments : for the driver executable -# -# default : default values and configuration parameters for the driver, can -# be an absolute path or relative to $ONE_LOCATION/etc (or -# /etc/one/ if OpenNebula was installed in /) -# -# type : driver type, supported drivers: xen, kvm, xml -# -# keep_snapshots: do not remove snapshots on power on/off cycles and live -# migrations if the hypervisor supports that. -# -# imported_vms_actions : comma-separated list of actions supported -# for imported vms. The available actions are: -# migrate -# live-migrate -# terminate -# terminate-hard -# undeploy -# undeploy-hard -# hold -# release -# stop -# suspend -# resume -# delete -# delete-recreate -# reboot -# reboot-hard -# resched -# unresched -# poweroff -# poweroff-hard -# disk-attach -# disk-detach -# nic-attach -# nic-detach -# snap-create -# snap-delete -#******************************************************************************* - -#------------------------------------------------------------------------------- -# KVM Virtualization Driver Manager Configuration -# -r number of retries when monitoring a host -# -t number of threads, i.e. number of hosts monitored at the same time -# -l actions executed locally, command can be -# overridden for each action. -# Valid actions: deploy, shutdown, cancel, save, restore, migrate, poll -# An example: "-l migrate=migrate_local,save" -# -p more than one action per host in parallel, needs support from hypervisor -# -s to execute remote commands, bash by default -# -# Note: You can use type = "qemu" to use qemu emulated guests, e.g. if your -# CPU does not have virtualization extensions or use nested Qemu-KVM hosts -#------------------------------------------------------------------------------- -VM_MAD = [ - NAME = "kvm", - SUNSTONE_NAME = "KVM", - EXECUTABLE = "one_vmm_exec", - ARGUMENTS = "-t 15 -r 0 kvm", - DEFAULT = "vmm_exec/vmm_exec_kvm.conf", - TYPE = "kvm", - KEEP_SNAPSHOTS = "no", - IMPORTED_VMS_ACTIONS = "terminate, terminate-hard, hold, release, suspend, - resume, delete, reboot, reboot-hard, resched, unresched, disk-attach, - disk-detach, nic-attach, nic-detach, snap-create, snap-delete" -] - -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# vCenter Virtualization Driver Manager Configuration -# -r number of retries when monitoring a host -# -t number of threads, i.e. number of hosts monitored at the same time -# -p more than one action per host in parallel, needs support from hypervisor -# -s to execute commands, bash by default -# -d default snapshot strategy. It can be either 'detach' or 'suspend'. It -# defaults to 'suspend'. -#------------------------------------------------------------------------------- -#VM_MAD = [ -# NAME = "vcenter", -# SUNSTONE_NAME = "VMWare vCenter", -# EXECUTABLE = "one_vmm_sh", -# ARGUMENTS = "-p -t 15 -r 0 vcenter -s sh", -# DEFAULT = "vmm_exec/vmm_exec_vcenter.conf", -# TYPE = "xml", -# KEEP_SNAPSHOTS = "yes", -# IMPORTED_VMS_ACTIONS = "terminate, terminate-hard, hold, release, suspend, -# resume, delete, reboot, reboot-hard, resched, unresched, poweroff, -# poweroff-hard, disk-attach, disk-detach, nic-attach, nic-detach, -# snap-create, snap-delete" -#] -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# EC2 Virtualization Driver Manager Configuration -# -r number of retries when monitoring a host -# -t number of threads, i.e. number of actions performed at the same time -#------------------------------------------------------------------------------- -#VM_MAD = [ -# NAME = "ec2", -# SUNSTONE_NAME = "Amazon EC2", -# EXECUTABLE = "one_vmm_sh", -# ARGUMENTS = "-t 15 -r 0 ec2", -# TYPE = "xml", -# KEEP_SNAPSHOTS = "no", -# IMPORTED_VMS_ACTIONS = "terminate, terminate-hard, hold, release, suspend, -# resume, delete, reboot, reboot-hard, resched, unresched, poweroff, -# poweroff-hard, disk-attach, disk-detach, nic-attach, nic-detach, -# snap-create, snap-delete" -#] -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# Azure Virtualization Driver Manager Configuration -# -r number of retries when monitoring a host -# -t number of threads, i.e. number of actions performed at the same time -#------------------------------------------------------------------------------- -#VM_MAD = [ -# NAME = "az", -# SUNSTONE_NAME = "Microsoft Azure", -# EXECUTABLE = "one_vmm_sh", -# ARGUMENTS = "-t 15 -r 0 az", -# TYPE = "xml", -# KEEP_SNAPSHOTS = "no", -# IMPORTED_VMS_ACTIONS = "terminate, terminate-hard, hold, release, suspend, -# resume, delete, reboot, reboot-hard, resched, unresched, poweroff, -# poweroff-hard, disk-attach, disk-detach, nic-attach, nic-detach, -# snap-create, snap-delete" -#] -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# Dummy Virtualization Driver Configuration -#------------------------------------------------------------------------------- -VM_MAD = [ NAME="dummy", SUNSTONE_NAME="Testing", EXECUTABLE="one_vmm_dummy", - TYPE="xml" ] -#------------------------------------------------------------------------------- - -#******************************************************************************* -# Transfer Manager Driver Configuration -#******************************************************************************* -# You can add more transfer managers with different configurations but make -# sure it has different names. -# name : name for this transfer driver -# -# executable: path of the transfer driver executable, can be an -# absolute path or relative to $ONE_LOCATION/lib/mads (or -# /usr/lib/one/mads/ if OpenNebula was installed in /) -# arguments : -# -t: number of threads, i.e. number of transfers made at the same time -# -d: list of transfer drivers separated by commas, if not defined all the -# drivers available will be enabled -#******************************************************************************* - -TM_MAD = [ - EXECUTABLE = "one_tm", - ARGUMENTS = "-t 15 -d dummy,lvm,shared,fs_lvm,qcow2,ssh,ceph,dev,vcenter,iscsi_libvirt" -] - -#******************************************************************************* -# Datastore Driver Configuration -#******************************************************************************* -# Drivers to manage the datastores, specialized for the storage backend -# executable: path of the transfer driver executable, can be an -# absolute path or relative to $ONE_LOCATION/lib/mads (or -# /usr/lib/one/mads/ if OpenNebula was installed in /) -# -# arguments : for the driver executable -# -t number of threads, i.e. number of repo operations at the same time -# -d datastore mads separated by commas -# -s system datastore tm drivers, used to monitor shared system ds. -#******************************************************************************* - -DATASTORE_MAD = [ - EXECUTABLE = "one_datastore", - ARGUMENTS = "-t 15 -d dummy,fs,lvm,ceph,dev,iscsi_libvirt,vcenter -s shared,ssh,ceph,fs_lvm,qcow2" -] - -#******************************************************************************* -# Marketplace Driver Configuration -#******************************************************************************* -# Drivers to manage different marketplaces, specialized for the storage backend -# executable: path of the transfer driver executable, can be an -# absolute path or relative to $ONE_LOCATION/lib/mads (or -# /usr/lib/one/mads/ if OpenNebula was installed in /) -# -# arguments : for the driver executable -# -t number of threads, i.e. number of repo operations at the same time -# -m marketplace mads separated by commas -#******************************************************************************* - -MARKET_MAD = [ - EXECUTABLE = "one_market", - ARGUMENTS = "-t 15 -m http,s3,one" -] - -#******************************************************************************* -# Hook Manager Configuration -#******************************************************************************* -# The Driver (HM_MAD) -# ----------------------------------------------- -# -# Used to execute the Hooks: -# executable: path of the hook driver executable, can be an -# absolute path or relative to $ONE_LOCATION/lib/mads (or -# /usr/lib/one/mads/ if OpenNebula was installed in /) -# -# arguments : for the driver executable, can be an absolute path or relative -# to $ONE_LOCATION/etc (or /etc/one/ if OpenNebula was installed -# in /) -# -# Virtual Machine Hooks (VM_HOOK) -# ------------------------------- -# -# Defined by: -# name : for the hook, useful to track the hook (OPTIONAL) -# on : when the hook should be executed, -# - CREATE, when the VM is created (onevm create) -# - PROLOG, when the VM is in the prolog state -# - RUNNING, after the VM is successfully booted -# - UNKNOWN, when the VM is in the unknown state -# - SHUTDOWN, after the VM is shutdown -# - STOP, after the VM is stopped (including VM image transfers) -# - DONE, after the VM is deleted or shutdown -# - CUSTOM, user defined specific STATE and LCM_STATE combination -# of states to trigger the hook. -# command : path is relative to $ONE_LOCATION/var/remotes/hook -# (self-contained) or to /var/lib/one/remotes/hook (system-wide). -# That directory will be copied on the hosts under -# SCRIPTS_REMOTE_DIR. It can be an absolute path that must exist -# on the target host -# arguments : for the hook. You can access to VM information with $ -# - $ID, the ID of the virtual machine -# - $TEMPLATE, the VM template in xml and base64 encoded -# - $PREV_STATE, the previous STATE of the Virtual Machine -# - $PREV_LCM_STATE, the previous LCM STATE of the Virtual Machine -# remote : values, -# - YES, The hook is executed in the host where the VM was -# allocated -# - NO, The hook is executed in the OpenNebula server (default) -# -# Example Virtual Machine Hook -# ---------------------------- -# -# VM_HOOK = [ -# name = "advanced_hook", -# on = "CUSTOM", -# state = "ACTIVE", -# lcm_state = "BOOT_UNKNOWN", -# command = "log.rb", -# arguments = "$ID $PREV_STATE $PREV_LCM_STATE" ] -# -# Host Hooks (HOST_HOOK) -# ------------------------------- -# -# Defined by: -# name : for the hook, useful to track the hook (OPTIONAL) -# on : when the hook should be executed, -# - CREATE, when the Host is created (onehost create) -# - ERROR, when the Host enters the error state -# - DISABLE, when the Host is disabled -# command : path is relative to $ONE_LOCATION/var/remotes/hook -# (self-contained) or to /var/lib/one/remotes/hook (system-wide). -# That directory will be copied on the hosts under -# SCRIPTS_REMOTE_DIR. It can be an absolute path that must exist -# on the target host. -# arguments : for the hook. You can use the following Host information: -# - $ID, the ID of the host -# - $TEMPLATE, the Host template in xml and base64 encoded -# remote : values, -# - YES, The hook is executed in the host -# - NO, The hook is executed in the OpenNebula server (default) -# -# Virtual Network (VNET_HOOK) -# Virtual Router (VROUTER_HOOK) -# User (USER_HOOK) -# Group (GROUP_HOOK) -# Image (IMAGE_HOOK) -# ------------------------------- -# -# These hooks are executed when one of the referring entities are created or -# removed. Each hook is defined by: -# name : for the hook, useful to track the hook (OPTIONAL) -# on : when the hook should be executed, -# - CREATE, when the vnet is created -# - REMOVE, when the vnet is removed -# command : path is relative to $ONE_LOCATION/var/remotes/hook -# (self-contained) or to /var/lib/one/remotes/hook (system-wide). -# That directory will be copied on the hosts under -# SCRIPTS_REMOTE_DIR. It can be an absolute path that must exist -# on the target host. -# arguments : for the hook. You can use the following Host information: -# - $ID, the ID of the host -# - $TEMPLATE, the vnet template in xml and base64 encoded -# -# Please note: In a Federation, User and Group hooks can only be defined in -# the master OpenNebula. -#------------------------------------------------------------------------------- -HM_MAD = [ - EXECUTABLE = "one_hm" ] - -#******************************************************************************* -# Fault Tolerance Hooks -#******************************************************************************* -# This hook is used to perform recovery actions when a host fails. -# Script to implement host failure tolerance -# It can be set to -# -m migrate VMs to another host. Only for images in shared storage -# -r recreate VMs running in the host. State will be lost. -# -d delete VMs running in the host -# Additional flags -# -f force resubmission of suspended VMs -# -p avoid resubmission if host comes -# back after n monitoring cycles -#******************************************************************************* -# -#HOST_HOOK = [ -# NAME = "error", -# ON = "ERROR", -# COMMAND = "ft/host_error.rb", -# ARGUMENTS = "$ID -m -p 5", -# REMOTE = "no" ] -#------------------------------------------------------------------------------- - -#******************************************************************************* -# Auth Manager Configuration -#******************************************************************************* -# AUTH_MAD: The Driver that will be used to authenticate (authn) and -# authorize (authz) OpenNebula requests. If defined OpenNebula will use the -# built-in auth policies. -# -# executable: path of the auth driver executable, can be an -# absolute path or relative to $ONE_LOCATION/lib/mads (or -# /usr/lib/one/mads/ if OpenNebula was installed in /) -# -# authn : list of authentication modules separated by commas, if not -# defined all the modules available will be enabled -# authz : list of authentication modules separated by commas -# -# DEFAULT_AUTH: The default authentication driver to use when OpenNebula does -# not know the user and needs to authenticate it externally. If you want to -# use "default" (not recommended, but supported for backwards compatibility -# reasons) make sure you create a symlink pointing to the actual authentication -# driver in /var/lib/one/remotes/auth, and add "default" to the 'auth' -# parameter in the 'AUTH_MAD' section. -# -# SESSION_EXPIRATION_TIME: Time in seconds to keep an authenticated token as -# valid. During this time, the driver is not used. Use 0 to disable session -# caching -# -# ENABLE_OTHER_PERMISSIONS: Whether or not users can set the permissions for -# 'other', so publishing or sharing resources with others. Users in the oneadmin -# group will still be able to change these permissions. Values: YES or NO. -# -# DEFAULT_UMASK: Similar to Unix umask, sets the default resources permissions. -# Its format must be 3 octal digits. For example a umask of 137 will set -# the new object's permissions to 640 "um- u-- ---" -#******************************************************************************* - -AUTH_MAD = [ - EXECUTABLE = "one_auth_mad", - AUTHN = "ssh,x509,ldap,server_cipher,server_x509" -] - -#DEFAULT_AUTH = "default" - -SESSION_EXPIRATION_TIME = 900 - -#ENABLE_OTHER_PERMISSIONS = "YES" - -DEFAULT_UMASK = 177 - -#******************************************************************************* -# OneGate -# ONEGATE_ENDPOINT: The URL for the onegate server (the Gate to OpenNebula for -# VMs). The onegate server is started using a separate command. The endpoint -# MUST be consistent with the values in onegate-server.conf -#******************************************************************************* - -#ONEGATE_ENDPOINT = "http://frontend:5030" - -#******************************************************************************* -# Restricted Attributes Configuration -#******************************************************************************* -# The following attributes are restricted to users outside the oneadmin group -#******************************************************************************* - -VM_RESTRICTED_ATTR = "CONTEXT/FILES" -VM_RESTRICTED_ATTR = "NIC/MAC" -VM_RESTRICTED_ATTR = "NIC/VLAN_ID" -VM_RESTRICTED_ATTR = "NIC/BRIDGE" -VM_RESTRICTED_ATTR = "NIC_DEFAULT/MAC" -VM_RESTRICTED_ATTR = "NIC_DEFAULT/VLAN_ID" -VM_RESTRICTED_ATTR = "NIC_DEFAULT/BRIDGE" -VM_RESTRICTED_ATTR = "DISK/TOTAL_BYTES_SEC" -VM_RESTRICTED_ATTR = "DISK/READ_BYTES_SEC" -VM_RESTRICTED_ATTR = "DISK/WRITE_BYTES_SEC" -VM_RESTRICTED_ATTR = "DISK/TOTAL_IOPS_SEC" -VM_RESTRICTED_ATTR = "DISK/READ_IOPS_SEC" -VM_RESTRICTED_ATTR = "DISK/WRITE_IOPS_SEC" -#VM_RESTRICTED_ATTR = "DISK/SIZE" -VM_RESTRICTED_ATTR = "DISK/ORIGINAL_SIZE" -VM_RESTRICTED_ATTR = "CPU_COST" -VM_RESTRICTED_ATTR = "MEMORY_COST" -VM_RESTRICTED_ATTR = "DISK_COST" -VM_RESTRICTED_ATTR = "PCI" -VM_RESTRICTED_ATTR = "USER_INPUTS" - -#VM_RESTRICTED_ATTR = "RANK" -#VM_RESTRICTED_ATTR = "SCHED_RANK" -#VM_RESTRICTED_ATTR = "REQUIREMENTS" -#VM_RESTRICTED_ATTR = "SCHED_REQUIREMENTS" - -IMAGE_RESTRICTED_ATTR = "SOURCE" - -#******************************************************************************* -# The following restricted attributes only apply to VNets that are a reservation. -# Normal VNets do not have restricted attributes. -#******************************************************************************* - -VNET_RESTRICTED_ATTR = "VN_MAD" -VNET_RESTRICTED_ATTR = "PHYDEV" -VNET_RESTRICTED_ATTR = "VLAN_ID" -VNET_RESTRICTED_ATTR = "BRIDGE" - -VNET_RESTRICTED_ATTR = "AR/VN_MAD" -VNET_RESTRICTED_ATTR = "AR/PHYDEV" -VNET_RESTRICTED_ATTR = "AR/VLAN_ID" -VNET_RESTRICTED_ATTR = "AR/BRIDGE" - -#******************************************************************************* -# Inherited Attributes Configuration -#******************************************************************************* -# The following attributes will be copied from the resource template to the -# instantiated VMs. More than one attribute can be defined. -# -# INHERIT_IMAGE_ATTR: Attribute to be copied from the Image template -# to each VM/DISK. -# -# INHERIT_DATASTORE_ATTR: Attribute to be copied from the Datastore template -# to each VM/DISK. -# -# INHERIT_VNET_ATTR: Attribute to be copied from the Network template -# to each VM/NIC. -#******************************************************************************* - -#INHERIT_IMAGE_ATTR = "EXAMPLE" -#INHERIT_IMAGE_ATTR = "SECOND_EXAMPLE" -#INHERIT_DATASTORE_ATTR = "COLOR" -#INHERIT_VNET_ATTR = "BANDWIDTH_THROTTLING" - -INHERIT_DATASTORE_ATTR = "CEPH_HOST" -INHERIT_DATASTORE_ATTR = "CEPH_SECRET" -INHERIT_DATASTORE_ATTR = "CEPH_USER" -INHERIT_DATASTORE_ATTR = "CEPH_KEY" -INHERIT_DATASTORE_ATTR = "CEPH_CONF" -INHERIT_DATASTORE_ATTR = "POOL_NAME" - -INHERIT_DATASTORE_ATTR = "ISCSI_USER" -INHERIT_DATASTORE_ATTR = "ISCSI_USAGE" -INHERIT_DATASTORE_ATTR = "ISCSI_HOST" - -INHERIT_IMAGE_ATTR = "ISCSI_USER" -INHERIT_IMAGE_ATTR = "ISCSI_USAGE" -INHERIT_IMAGE_ATTR = "ISCSI_HOST" -INHERIT_IMAGE_ATTR = "ISCSI_IQN" - -INHERIT_DATASTORE_ATTR = "GLUSTER_HOST" -INHERIT_DATASTORE_ATTR = "GLUSTER_VOLUME" - -INHERIT_DATASTORE_ATTR = "DISK_TYPE" -INHERIT_DATASTORE_ATTR = "VCENTER_ADAPTER_TYPE" -INHERIT_DATASTORE_ATTR = "VCENTER_DISK_TYPE" -INHERIT_DATASTORE_ATTR = "VCENTER_DS_REF" -INHERIT_DATASTORE_ATTR = "VCENTER_DS_IMAGE_DIR" -INHERIT_DATASTORE_ATTR = "VCENTER_DS_VOLATILE_DIR" -INHERIT_DATASTORE_ATTR = "VCENTER_INSTANCE_ID" - - -INHERIT_IMAGE_ATTR = "DISK_TYPE" -INHERIT_IMAGE_ATTR = "VCENTER_ADAPTER_TYPE" -INHERIT_IMAGE_ATTR = "VCENTER_DISK_TYPE" - -INHERIT_VNET_ATTR = "VLAN_TAGGED_ID" -INHERIT_VNET_ATTR = "FILTER_IP_SPOOFING" -INHERIT_VNET_ATTR = "FILTER_MAC_SPOOFING" -INHERIT_VNET_ATTR = "MTU" - -#******************************************************************************* -# Transfer Manager Driver Behavior Configuration -#******************************************************************************* -# The configuration for each driver is defined in TM_MAD_CONF. These -# values are used when creating a new datastore and should not be modified -# since they define the datastore behavior. -# name : name of the transfer driver, listed in the -d option of the -# TM_MAD section -# ln_target : determines how the persistent images will be cloned when -# a new VM is instantiated. -# NONE: The image will be linked and no more storage capacity will be used -# SELF: The image will be cloned in the Images datastore -# SYSTEM: The image will be cloned in the System datastore -# clone_target : determines how the non persistent images will be -# cloned when a new VM is instantiated. -# NONE: The image will be linked and no more storage capacity will be used -# SELF: The image will be cloned in the Images datastore -# SYSTEM: The image will be cloned in the System datastore -# shared : determines if the storage holding the system datastore is shared -# among the different hosts or not. Valid values: "yes" or "no" -# ds_migrate : The driver allows migrations across datastores. Valid values: -# "yes" or "no". Note: THIS ONLY APPLIES TO SYSTEM DS. -#******************************************************************************* - -TM_MAD_CONF = [ - NAME = "dummy", LN_TARGET = "NONE", CLONE_TARGET = "SYSTEM", SHARED = "YES", - DS_MIGRATE = "YES" -] - -TM_MAD_CONF = [ - NAME = "lvm", LN_TARGET = "NONE", CLONE_TARGET = "SELF", SHARED = "YES" -] - -TM_MAD_CONF = [ - NAME = "shared", LN_TARGET = "NONE", CLONE_TARGET = "SYSTEM", SHARED = "YES", - DS_MIGRATE = "YES" -] - -TM_MAD_CONF = [ - NAME = "fs_lvm", LN_TARGET = "SYSTEM", CLONE_TARGET = "SYSTEM", SHARED="YES" -] - -TM_MAD_CONF = [ - NAME = "qcow2", LN_TARGET = "NONE", CLONE_TARGET = "SYSTEM", SHARED = "YES" -] - -TM_MAD_CONF = [ - NAME = "ssh", LN_TARGET = "SYSTEM", CLONE_TARGET = "SYSTEM", SHARED = "NO", - DS_MIGRATE = "YES" -] - -TM_MAD_CONF = [ - NAME = "ceph", LN_TARGET = "NONE", CLONE_TARGET = "SELF", SHARED = "YES", - DS_MIGRATE = "NO" -] - -TM_MAD_CONF = [ - NAME = "iscsi_libvirt", LN_TARGET = "NONE", CLONE_TARGET = "SELF", SHARED = "YES", - DS_MIGRATE = "NO" -] - -TM_MAD_CONF = [ - NAME = "dev", LN_TARGET = "NONE", CLONE_TARGET = "NONE", SHARED = "YES" -] - -TM_MAD_CONF = [ - NAME = "vcenter", LN_TARGET = "NONE", CLONE_TARGET = "NONE", SHARED = "YES" -] - -#******************************************************************************* -# Datastore Manager Driver Behavior Configuration -#******************************************************************************* -# The configuration for each driver is defined in DS_MAD_CONF. These -# values are used when creating a new datastore and should not be modified -# since they define the datastore behavior. -# name : name of the transfer driver, listed in the -d option of the -# DS_MAD section -# required_attrs : comma separated list of required attributes in the DS -# template -# persistent_only: specifies whether the datastore can only manage persistent -# images -#******************************************************************************* - -DS_MAD_CONF = [ - NAME = "ceph", - REQUIRED_ATTRS = "DISK_TYPE,BRIDGE_LIST", - PERSISTENT_ONLY = "NO", - MARKETPLACE_ACTIONS = "export" -] - -DS_MAD_CONF = [ - NAME = "dev", REQUIRED_ATTRS = "DISK_TYPE", PERSISTENT_ONLY = "YES" -] - -DS_MAD_CONF = [ - NAME = "iscsi_libvirt", REQUIRED_ATTRS = "DISK_TYPE,ISCSI_HOST", - PERSISTENT_ONLY = "YES" -] - -DS_MAD_CONF = [ - NAME = "dummy", REQUIRED_ATTRS = "", PERSISTENT_ONLY = "NO" -] - -DS_MAD_CONF = [ - NAME = "fs", REQUIRED_ATTRS = "", PERSISTENT_ONLY = "NO", - MARKETPLACE_ACTIONS = "export" -] - -DS_MAD_CONF = [ - NAME = "lvm", REQUIRED_ATTRS = "DISK_TYPE,BRIDGE_LIST", - PERSISTENT_ONLY = "NO" -] - -DS_MAD_CONF = [ - NAME = "vcenter", - REQUIRED_ATTRS = "VCENTER_INSTANCE_ID, VCENTER_DS_REF, VCENTER_DC_REF", - PERSISTENT_ONLY = "NO", - MARKETPLACE_ACTIONS = "export" -] - -#******************************************************************************* -# MarketPlace Driver Behavior Configuration -#******************************************************************************* -# The configuration for each driver is defined in MARKET_MAD_CONF. These -# values are used when creating a new marketplaces and should not be modified -# since they define the marketplace behavior. -# name : name of the market driver -# required_attrs : comma separated list of required attributes in the Market -# template -# app_actions: List of actions allowed for a MarketPlaceApp -# - monitor The apps of the marketplace will be monitored -# - create, the app in the marketplace -# - delete, the app from the marketplace -# public: set to yes for external marketplaces. A public marketplace can be -# removed even if it has registered apps. -#******************************************************************************* - -MARKET_MAD_CONF = [ - NAME = "one", - SUNSTONE_NAME = "OpenNebula.org Marketplace", - REQUIRED_ATTRS = "", - APP_ACTIONS = "monitor", - PUBLIC = "yes" -] - -MARKET_MAD_CONF = [ - NAME = "http", - SUNSTONE_NAME = "HTTP server", - REQUIRED_ATTRS = "BASE_URL,PUBLIC_DIR", - APP_ACTIONS = "create, delete, monitor" -] - -MARKET_MAD_CONF = [ - NAME = "s3", - SUNSTONE_NAME = "Amazon S3", - REQUIRED_ATTRS = "ACCESS_KEY_ID,SECRET_ACCESS_KEY,REGION,BUCKET", - APP_ACTIONS = "create, delete, monitor" -] diff --git a/src/oca/java/test/test.sh b/src/oca/java/test/test.sh deleted file mode 100755 index fc6e35c2e1..0000000000 --- a/src/oca/java/test/test.sh +++ /dev/null @@ -1,66 +0,0 @@ -#!/bin/bash - -# -------------------------------------------------------------------------- # -# Copyright 2002-2017, OpenNebula Project, OpenNebula Systems # -# # -# Licensed under the Apache License, Version 2.0 (the "License"); you may # -# not use this file except in compliance with the License. You may obtain # -# a copy of the License at # -# # -# http://www.apache.org/licenses/LICENSE-2.0 # -# # -# Unless required by applicable law or agreed to in writing, software # -# distributed under the License is distributed on an "AS IS" BASIS, # -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -# See the License for the specific language governing permissions and # -# limitations under the License. # -#--------------------------------------------------------------------------- # - -# Usage: test.sh -# For instance: test.sh ImageTest - - -if [ -z $ONE_LOCATION ]; then - DB_LOCATION="/var/lib/one/one.db" - LOG_LOCATION="/var/log/one" - AUTH_LOCATION="/var/lib/one/.one" -else - DB_LOCATION="$ONE_LOCATION/var/one.db" - LOG_LOCATION="$ONE_LOCATION/var" - AUTH_LOCATION="$ONE_LOCATION/var/.one" -fi - -if [ -f $DB_LOCATION ]; then - echo "$DB_LOCATION has to be overwritten, move it to a safe place." - exit -1 -fi - -echo "=========================================================================" -echo "Doing $1" -echo "=========================================================================" - -rm -rf $AUTH_LOCATION - -PID=$$ - -oned -f & - -sleep 2; - -until grep 'Datastore default (1) successfully monitored' $LOG_LOCATION/oned.log; do - sleep 1; -done - -echo 'SAFE_DIRS = "/"' > /tmp/one-javatest-ds.txt -onedatastore update --append 1 /tmp/one-javatest-ds.txt - -java -cp ../lib/*:../jar/*:. org.junit.runner.JUnitCore $1 - -CODE=$? - -pkill -P $PID oned -sleep 4s; -pkill -9 -P $PID oned -rm -f $DB_LOCATION - -exit $CODE \ No newline at end of file