From 00426ede465519b6bd548691bf681d45e68cdf33 Mon Sep 17 00:00:00 2001 From: John Bampton Date: Wed, 11 Jan 2023 21:25:31 +1000 Subject: [PATCH] Add `pre-commit` workflow with 3 Git hooks (#6273) Co-authored-by: dahn --- .github/workflows/linter.yml | 24 +- .pre-commit-config.yaml | 42 ++ ...dTemplateDirectDownloadCertificateCmd.java | 0 .../test/java/com/cloud/host/HostVOTest.java | 122 ++-- .../baremetal/database/BaremetalRctDao.java | 52 +- .../database/BaremetalRctDaoImpl.java | 52 +- .../baremetal/database/BaremetalRctVO.java | 164 ++--- .../cloud/baremetal/manager/BaremetalRct.java | 250 +++---- .../manager/BaremetalVlanManager.java | 86 +-- .../manager/BaremetalVlanManagerImpl.java | 544 +++++++-------- .../networkservice/BaremetalRctResponse.java | 110 +-- .../BaremetalSwitchBackend.java | 68 +- .../BaremetalVirtualRouterCommands.java | 244 +++---- .../networkservice/BaremetalVlanStruct.java | 184 ++--- .../Force10BaremetalSwitchBackend.java | 332 ++++----- .../security_group_agent/cs_sg_agent.py | 472 ++++++------- .../security_group_agent/xmlobject.py | 194 +++--- test/integration/component/test_host.py | 400 +++++------ .../component/test_multi_tag_support.py | 434 ++++++------ .../test_ncc_integration_dedicated.py | 538 +++++++-------- .../component/test_ncc_integration_shared.py | 646 +++++++++--------- 21 files changed, 2509 insertions(+), 2449 deletions(-) create mode 100644 .pre-commit-config.yaml mode change 100755 => 100644 api/src/main/java/org/apache/cloudstack/api/command/admin/direct/download/UploadTemplateDirectDownloadCertificateCmd.java diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index 7d5a35464df..a484903d99b 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -15,7 +15,7 @@ # specific language governing permissions and limitations # under the License. -name: Lint Code Base +name: Lint on: [pull_request] @@ -31,7 +31,7 @@ jobs: permissions: contents: read # for actions/checkout to fetch code statuses: write # for github/super-linter to mark status of each linter run - name: SuperLinter Check + name: Super-Linter Check runs-on: ubuntu-latest steps: - name: Checkout Code @@ -39,10 +39,28 @@ jobs: with: # Full git history is needed to get a proper list of changed files within `super-linter` fetch-depth: 0 - - name: SuperLinter + - name: Super-Linter uses: github/super-linter@v4 env: DEFAULT_BRANCH: main GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} VALIDATE_ALL_CODEBASE: false VALIDATE_PYTHON_FLAKE8: true + pre-commit: + name: Run pre-commit + runs-on: ubuntu-latest + steps: + - name: Check Out + uses: actions/checkout@v3 + - name: Install + run: | + python -m pip install --upgrade pip + pip install pre-commit + - name: Set PY + run: echo "PY=$(python -VV | sha256sum | cut -d' ' -f1)" >> $GITHUB_ENV + - uses: actions/cache@v3 + with: + path: ~/.cache/pre-commit + key: pre-commit|${{ env.PY }}|${{ hashFiles('.pre-commit-config.yaml') }} + - name: Run pre-commit + run: pre-commit run --all-files diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 00000000000..3641357e88a --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,42 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +--- +default_stages: [commit, push] +default_language_version: + # force all unspecified Python hooks to run python3 + python: python3 +minimum_pre_commit_version: "2.18.0" +repos: + - repo: meta + hooks: + - id: identity + - id: check-hooks-apply + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.1.0 + hooks: + #- id: check-added-large-files + #- id: check-case-conflict + #- id: check-executables-have-shebangs + #- id: check-merge-conflict + #- id: check-vcs-permalinks + #- id: check-yaml + #- id: detect-private-key + #- id: end-of-file-fixer + #- id: fix-byte-order-marker + - id: mixed-line-ending + files: \.(java|py)$ + # - id: trailing-whitespace diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/direct/download/UploadTemplateDirectDownloadCertificateCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/direct/download/UploadTemplateDirectDownloadCertificateCmd.java old mode 100755 new mode 100644 diff --git a/engine/schema/src/test/java/com/cloud/host/HostVOTest.java b/engine/schema/src/test/java/com/cloud/host/HostVOTest.java index 291fd30c20d..9ab010dd6a7 100755 --- a/engine/schema/src/test/java/com/cloud/host/HostVOTest.java +++ b/engine/schema/src/test/java/com/cloud/host/HostVOTest.java @@ -1,61 +1,61 @@ -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. -package com.cloud.host; - -import com.cloud.service.ServiceOfferingVO; -import com.cloud.vm.VirtualMachine; -import java.util.Arrays; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import org.junit.Test; -import org.junit.Before; - -public class HostVOTest { - HostVO host; - ServiceOfferingVO offering; - - @Before - public void setUp() throws Exception { - host = new HostVO(); - offering = new ServiceOfferingVO("TestSO", 0, 0, 0, 0, 0, - false, "TestSO", false,VirtualMachine.Type.User,false); - } - - @Test - public void testNoSO() { - assertFalse(host.checkHostServiceOfferingTags(null)); - } - - @Test - public void testNoTag() { - assertTrue(host.checkHostServiceOfferingTags(offering)); - } - - @Test - public void testRightTag() { - host.setHostTags(Arrays.asList("tag1","tag2")); - offering.setHostTag("tag2,tag1"); - assertTrue(host.checkHostServiceOfferingTags(offering)); - } - - @Test - public void testWrongTag() { - host.setHostTags(Arrays.asList("tag1","tag2")); - offering.setHostTag("tag2,tag4"); - assertFalse(host.checkHostServiceOfferingTags(offering)); - } -} \ No newline at end of file +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.host; + +import com.cloud.service.ServiceOfferingVO; +import com.cloud.vm.VirtualMachine; +import java.util.Arrays; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import org.junit.Test; +import org.junit.Before; + +public class HostVOTest { + HostVO host; + ServiceOfferingVO offering; + + @Before + public void setUp() throws Exception { + host = new HostVO(); + offering = new ServiceOfferingVO("TestSO", 0, 0, 0, 0, 0, + false, "TestSO", false,VirtualMachine.Type.User,false); + } + + @Test + public void testNoSO() { + assertFalse(host.checkHostServiceOfferingTags(null)); + } + + @Test + public void testNoTag() { + assertTrue(host.checkHostServiceOfferingTags(offering)); + } + + @Test + public void testRightTag() { + host.setHostTags(Arrays.asList("tag1","tag2")); + offering.setHostTag("tag2,tag1"); + assertTrue(host.checkHostServiceOfferingTags(offering)); + } + + @Test + public void testWrongTag() { + host.setHostTags(Arrays.asList("tag1","tag2")); + offering.setHostTag("tag2,tag4"); + assertFalse(host.checkHostServiceOfferingTags(offering)); + } +} diff --git a/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/database/BaremetalRctDao.java b/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/database/BaremetalRctDao.java index 7da7fe69a7e..33484f4dbec 100644 --- a/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/database/BaremetalRctDao.java +++ b/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/database/BaremetalRctDao.java @@ -1,26 +1,26 @@ -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. -// -package com.cloud.baremetal.database; - -import com.cloud.utils.db.GenericDao; - -/** - * Created by frank on 5/8/14. - */ -public interface BaremetalRctDao extends GenericDao { -} +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// +package com.cloud.baremetal.database; + +import com.cloud.utils.db.GenericDao; + +/** + * Created by frank on 5/8/14. + */ +public interface BaremetalRctDao extends GenericDao { +} diff --git a/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/database/BaremetalRctDaoImpl.java b/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/database/BaremetalRctDaoImpl.java index 8f4d74ad87c..b56c41fb3ea 100644 --- a/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/database/BaremetalRctDaoImpl.java +++ b/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/database/BaremetalRctDaoImpl.java @@ -1,26 +1,26 @@ -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. -// -package com.cloud.baremetal.database; - -import com.cloud.utils.db.GenericDaoBase; - -/** - * Created by frank on 5/8/14. - */ -public class BaremetalRctDaoImpl extends GenericDaoBase implements BaremetalRctDao { -} +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// +package com.cloud.baremetal.database; + +import com.cloud.utils.db.GenericDaoBase; + +/** + * Created by frank on 5/8/14. + */ +public class BaremetalRctDaoImpl extends GenericDaoBase implements BaremetalRctDao { +} diff --git a/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/database/BaremetalRctVO.java b/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/database/BaremetalRctVO.java index 3a24cf4554d..fdee9e6e2e1 100644 --- a/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/database/BaremetalRctVO.java +++ b/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/database/BaremetalRctVO.java @@ -1,82 +1,82 @@ -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. -// -package com.cloud.baremetal.database; - -import org.apache.cloudstack.api.Identity; -import org.apache.cloudstack.api.InternalIdentity; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; -import java.util.UUID; - -/** - * Created by frank on 5/8/14. - */ -@Entity -@Table(name = "baremetal_rct") -public class BaremetalRctVO implements InternalIdentity, Identity { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "id") - private long id; - - @Column(name = "uuid") - private String uuid = UUID.randomUUID().toString(); - - @Column(name = "url") - private String url; - - @Column(name = "rct") - private String rct; - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public String getUuid() { - return uuid; - } - - public void setUuid(String uuid) { - this.uuid = uuid; - } - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - public String getRct() { - return rct; - } - - public void setRct(String rct) { - this.rct = rct; - } -} +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// +package com.cloud.baremetal.database; + +import org.apache.cloudstack.api.Identity; +import org.apache.cloudstack.api.InternalIdentity; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import java.util.UUID; + +/** + * Created by frank on 5/8/14. + */ +@Entity +@Table(name = "baremetal_rct") +public class BaremetalRctVO implements InternalIdentity, Identity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + private long id; + + @Column(name = "uuid") + private String uuid = UUID.randomUUID().toString(); + + @Column(name = "url") + private String url; + + @Column(name = "rct") + private String rct; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getRct() { + return rct; + } + + public void setRct(String rct) { + this.rct = rct; + } +} diff --git a/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/manager/BaremetalRct.java b/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/manager/BaremetalRct.java index 96e78650743..97b3328ba0c 100644 --- a/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/manager/BaremetalRct.java +++ b/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/manager/BaremetalRct.java @@ -1,125 +1,125 @@ -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. -// -package com.cloud.baremetal.manager; - -import java.util.List; - -/** - * Created by frank on 5/8/14. - */ -public class BaremetalRct { - public static class SwitchEntry { - private String ip; - private String username; - private String password; - private String type; - - public String getIp() { - return ip; - } - - public void setIp(String ip) { - this.ip = ip; - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - } - - public static class HostEntry { - private String uuid; - private String mac; - private String port; - - public String getUuid() { - return uuid; - } - - public void setUuid(String uuid) { - this.uuid = uuid; - } - - public String getMac() { - return mac; - } - - public void setMac(String mac) { - this.mac = mac; - } - - public String getPort() { - return port; - } - - public void setPort(String port) { - this.port = port; - } - } - - public static class Rack { - private SwitchEntry l2Switch; - private List hosts; - - public SwitchEntry getL2Switch() { - return l2Switch; - } - - public void setL2Switch(SwitchEntry l2Switch) { - this.l2Switch = l2Switch; - } - - public List getHosts() { - return hosts; - } - - public void setHosts(List hosts) { - this.hosts = hosts; - } - } - - private List racks; - - public List getRacks() { - return racks; - } - - public void setRacks(List racks) { - this.racks = racks; - } -} +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// +package com.cloud.baremetal.manager; + +import java.util.List; + +/** + * Created by frank on 5/8/14. + */ +public class BaremetalRct { + public static class SwitchEntry { + private String ip; + private String username; + private String password; + private String type; + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + } + + public static class HostEntry { + private String uuid; + private String mac; + private String port; + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getMac() { + return mac; + } + + public void setMac(String mac) { + this.mac = mac; + } + + public String getPort() { + return port; + } + + public void setPort(String port) { + this.port = port; + } + } + + public static class Rack { + private SwitchEntry l2Switch; + private List hosts; + + public SwitchEntry getL2Switch() { + return l2Switch; + } + + public void setL2Switch(SwitchEntry l2Switch) { + this.l2Switch = l2Switch; + } + + public List getHosts() { + return hosts; + } + + public void setHosts(List hosts) { + this.hosts = hosts; + } + } + + private List racks; + + public List getRacks() { + return racks; + } + + public void setRacks(List racks) { + this.racks = racks; + } +} diff --git a/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/manager/BaremetalVlanManager.java b/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/manager/BaremetalVlanManager.java index b6311f79aab..4b3b70131c0 100644 --- a/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/manager/BaremetalVlanManager.java +++ b/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/manager/BaremetalVlanManager.java @@ -1,43 +1,43 @@ -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. -// -package com.cloud.baremetal.manager; - -import com.cloud.baremetal.networkservice.BaremetalRctResponse; -import com.cloud.baremetal.networkservice.BaremetalSwitchBackend; -import com.cloud.deploy.DeployDestination; -import com.cloud.network.Network; -import com.cloud.utils.component.Manager; -import com.cloud.utils.component.PluggableService; -import com.cloud.vm.VirtualMachineProfile; -import org.apache.cloudstack.api.AddBaremetalRctCmd; -import org.apache.cloudstack.api.DeleteBaremetalRctCmd; - -public interface BaremetalVlanManager extends Manager, PluggableService { - - BaremetalRctResponse addRct(AddBaremetalRctCmd cmd); - - void prepareVlan(Network nw, DeployDestination destHost); - - void releaseVlan(Network nw, VirtualMachineProfile vm); - - void registerSwitchBackend(BaremetalSwitchBackend backend); - - void deleteRct(DeleteBaremetalRctCmd cmd); - - BaremetalRctResponse listRct(); -} +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// +package com.cloud.baremetal.manager; + +import com.cloud.baremetal.networkservice.BaremetalRctResponse; +import com.cloud.baremetal.networkservice.BaremetalSwitchBackend; +import com.cloud.deploy.DeployDestination; +import com.cloud.network.Network; +import com.cloud.utils.component.Manager; +import com.cloud.utils.component.PluggableService; +import com.cloud.vm.VirtualMachineProfile; +import org.apache.cloudstack.api.AddBaremetalRctCmd; +import org.apache.cloudstack.api.DeleteBaremetalRctCmd; + +public interface BaremetalVlanManager extends Manager, PluggableService { + + BaremetalRctResponse addRct(AddBaremetalRctCmd cmd); + + void prepareVlan(Network nw, DeployDestination destHost); + + void releaseVlan(Network nw, VirtualMachineProfile vm); + + void registerSwitchBackend(BaremetalSwitchBackend backend); + + void deleteRct(DeleteBaremetalRctCmd cmd); + + BaremetalRctResponse listRct(); +} diff --git a/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/manager/BaremetalVlanManagerImpl.java b/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/manager/BaremetalVlanManagerImpl.java index 274962562be..5695325fb13 100644 --- a/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/manager/BaremetalVlanManagerImpl.java +++ b/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/manager/BaremetalVlanManagerImpl.java @@ -1,272 +1,272 @@ -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. -// -package com.cloud.baremetal.manager; - -import com.cloud.baremetal.database.BaremetalRctDao; -import com.cloud.baremetal.database.BaremetalRctVO; -import com.cloud.baremetal.networkservice.BaremetalRctResponse; -import com.cloud.baremetal.networkservice.BaremetalSwitchBackend; -import com.cloud.baremetal.networkservice.BaremetalVlanStruct; -import com.cloud.deploy.DeployDestination; -import com.cloud.host.HostVO; -import com.cloud.host.dao.HostDao; -import com.cloud.network.Network; -import com.cloud.network.Networks; -import com.cloud.user.Account; -import com.cloud.user.AccountManager; -import com.cloud.user.AccountVO; -import com.cloud.user.User; -import com.cloud.user.UserVO; -import com.cloud.user.dao.AccountDao; -import com.cloud.user.dao.UserDao; -import com.cloud.utils.component.ManagerBase; -import com.cloud.utils.db.QueryBuilder; -import com.cloud.utils.db.SearchCriteria; -import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.vm.VirtualMachineProfile; -import com.google.gson.Gson; -import org.apache.cloudstack.acl.RoleType; -import org.apache.cloudstack.api.AddBaremetalRctCmd; -import org.apache.cloudstack.api.DeleteBaremetalRctCmd; -import org.apache.cloudstack.api.ListBaremetalRctCmd; -import org.apache.cloudstack.utils.baremetal.BaremetalUtils; -import org.springframework.web.client.RestTemplate; - -import javax.inject.Inject; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.UUID; - -/** - * Created by frank on 5/8/14. - */ -public class BaremetalVlanManagerImpl extends ManagerBase implements BaremetalVlanManager { - private Gson gson = new Gson(); - - @Inject - private BaremetalRctDao rctDao; - @Inject - private HostDao hostDao; - @Inject - private AccountDao acntDao; - @Inject - private UserDao userDao; - @Inject - private AccountManager acntMgr; - - private Map backends; - - private class RackPair { - BaremetalRct.Rack rack; - BaremetalRct.HostEntry host; - } - - public void setBackends(Map backends) { - this.backends = backends; - } - - @Override - public BaremetalRctResponse addRct(AddBaremetalRctCmd cmd) { - try { - List existings = rctDao.listAll(); - if (!existings.isEmpty()) { - throw new CloudRuntimeException(String.format("there is some RCT existing. A CloudStack deployment accepts only one RCT")); - } - URL url = new URL(cmd.getRctUrl()); - RestTemplate rest = new RestTemplate(); - String rctStr = rest.getForObject(url.toString(), String.class); - - // validate it's right format - BaremetalRct rct = gson.fromJson(rctStr, BaremetalRct.class); - QueryBuilder sc = QueryBuilder.create(BaremetalRctVO.class); - sc.and(sc.entity().getUrl(), SearchCriteria.Op.EQ, cmd.getRctUrl()); - BaremetalRctVO vo = sc.find(); - if (vo == null) { - vo = new BaremetalRctVO(); - vo.setRct(gson.toJson(rct)); - vo.setUrl(cmd.getRctUrl()); - vo = rctDao.persist(vo); - } else { - vo.setRct(gson.toJson(rct)); - rctDao.update(vo.getId(), vo); - } - - BaremetalRctResponse rsp = new BaremetalRctResponse(); - rsp.setUrl(vo.getUrl()); - rsp.setId(vo.getUuid()); - rsp.setObjectName("baremetalrct"); - return rsp; - } catch (MalformedURLException e) { - throw new IllegalArgumentException(String.format("%s is not a legal http url", cmd.getRctUrl())); - } - } - - @Override - public void prepareVlan(Network nw, DeployDestination destHost) { - List vos = rctDao.listAll(); - if (vos.isEmpty()) { - throw new CloudRuntimeException("no rack configuration found, please call addBaremetalRct to add one"); - } - - BaremetalRctVO vo = vos.get(0); - BaremetalRct rct = gson.fromJson(vo.getRct(), BaremetalRct.class); - - RackPair rp = findRack(rct, destHost.getHost().getPrivateMacAddress()); - if (rp == null) { - throw new CloudRuntimeException(String.format("cannot find any rack contains host[mac:%s], please double check your rack configuration file, update it and call addBaremetalRct again", destHost.getHost().getPrivateMacAddress())); - } - - int vlan = Integer.parseInt(Networks.BroadcastDomainType.getValue(nw.getBroadcastUri())); - BaremetalSwitchBackend backend = getSwitchBackend(rp.rack.getL2Switch().getType()); - BaremetalVlanStruct struct = new BaremetalVlanStruct(); - struct.setHostMac(rp.host.getMac()); - struct.setPort(rp.host.getPort()); - struct.setSwitchIp(rp.rack.getL2Switch().getIp()); - struct.setSwitchPassword(rp.rack.getL2Switch().getPassword()); - struct.setSwitchType(rp.rack.getL2Switch().getType()); - struct.setSwitchUsername(rp.rack.getL2Switch().getUsername()); - struct.setVlan(vlan); - backend.prepareVlan(struct); - } - - @Override - public void releaseVlan(Network nw, VirtualMachineProfile vm) { - List vos = rctDao.listAll(); - if (vos.isEmpty()) { - throw new CloudRuntimeException("no rack configuration found, please call addBaremetalRct to add one"); - } - - BaremetalRctVO vo = vos.get(0); - BaremetalRct rct = gson.fromJson(vo.getRct(), BaremetalRct.class); - HostVO host = hostDao.findById(vm.getVirtualMachine().getHostId()); - RackPair rp = findRack(rct, host.getPrivateMacAddress()); - assert rp != null : String.format("where is my rack???"); - - int vlan = Integer.parseInt(Networks.BroadcastDomainType.getValue(nw.getBroadcastUri())); - BaremetalVlanStruct struct = new BaremetalVlanStruct(); - struct.setHostMac(rp.host.getMac()); - struct.setPort(rp.host.getPort()); - struct.setSwitchIp(rp.rack.getL2Switch().getIp()); - struct.setSwitchPassword(rp.rack.getL2Switch().getPassword()); - struct.setSwitchType(rp.rack.getL2Switch().getType()); - struct.setSwitchUsername(rp.rack.getL2Switch().getUsername()); - struct.setVlan(vlan); - BaremetalSwitchBackend backend = getSwitchBackend(rp.rack.getL2Switch().getType()); - backend.removePortFromVlan(struct); - } - - @Override - public void registerSwitchBackend(BaremetalSwitchBackend backend) { - backends.put(backend.getSwitchBackendType(), backend); - } - - @Override - public void deleteRct(DeleteBaremetalRctCmd cmd) { - rctDao.remove(cmd.getId()); - } - - @Override - public BaremetalRctResponse listRct() { - List vos = rctDao.listAll(); - if (!vos.isEmpty()) { - BaremetalRctVO vo = vos.get(0); - BaremetalRctResponse rsp = new BaremetalRctResponse(); - rsp.setId(vo.getUuid()); - rsp.setUrl(vo.getUrl()); - rsp.setObjectName("baremetalrct"); - return rsp; - } - return null; - } - - private BaremetalSwitchBackend getSwitchBackend(String type) { - BaremetalSwitchBackend backend = backends.get(type); - if (backend == null) { - throw new CloudRuntimeException(String.format("cannot find switch backend[type:%s]", type)); - } - return backend; - } - - private RackPair findRack(BaremetalRct rct, String mac) { - for (BaremetalRct.Rack rack : rct.getRacks()) { - for (BaremetalRct.HostEntry host : rack.getHosts()) { - if (mac.equals(host.getMac())) { - RackPair p = new RackPair(); - p.host = host; - p.rack = rack; - return p; - } - } - } - return null; - } - - @Override - public String getName() { - return "Baremetal Vlan Manager"; - } - - - @Override - public List> getCommands() { - List> cmds = new ArrayList>(); - cmds.add(AddBaremetalRctCmd.class); - cmds.add(ListBaremetalRctCmd.class); - cmds.add(DeleteBaremetalRctCmd.class); - return cmds; - } - - @Override - public boolean start() { - QueryBuilder acntq = QueryBuilder.create(AccountVO.class); - acntq.and(acntq.entity().getAccountName(), SearchCriteria.Op.EQ, BaremetalUtils.BAREMETAL_SYSTEM_ACCOUNT_NAME); - AccountVO acnt = acntq.find(); - if (acnt != null) { - return true; - } - - acnt = new AccountVO(); - acnt.setAccountName(BaremetalUtils.BAREMETAL_SYSTEM_ACCOUNT_NAME); - acnt.setUuid(UUID.randomUUID().toString()); - acnt.setState(Account.State.ENABLED); - acnt.setDomainId(1); - acnt.setType(RoleType.User.getAccountType()); - acnt.setRoleId(RoleType.User.getId()); - acnt = acntDao.persist(acnt); - - UserVO user = new UserVO(); - user.setState(Account.State.ENABLED); - user.setUuid(UUID.randomUUID().toString()); - user.setAccountId(acnt.getAccountId()); - user.setUsername(BaremetalUtils.BAREMETAL_SYSTEM_ACCOUNT_NAME); - user.setFirstname(BaremetalUtils.BAREMETAL_SYSTEM_ACCOUNT_NAME); - user.setLastname(BaremetalUtils.BAREMETAL_SYSTEM_ACCOUNT_NAME); - user.setPassword(UUID.randomUUID().toString()); - user.setSource(User.Source.UNKNOWN); - user = userDao.persist(user); - - String[] keys = acntMgr.createApiKeyAndSecretKey(user.getId()); - user.setApiKey(keys[0]); - user.setSecretKey(keys[1]); - userDao.update(user.getId(), user); - return true; - } -} +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// +package com.cloud.baremetal.manager; + +import com.cloud.baremetal.database.BaremetalRctDao; +import com.cloud.baremetal.database.BaremetalRctVO; +import com.cloud.baremetal.networkservice.BaremetalRctResponse; +import com.cloud.baremetal.networkservice.BaremetalSwitchBackend; +import com.cloud.baremetal.networkservice.BaremetalVlanStruct; +import com.cloud.deploy.DeployDestination; +import com.cloud.host.HostVO; +import com.cloud.host.dao.HostDao; +import com.cloud.network.Network; +import com.cloud.network.Networks; +import com.cloud.user.Account; +import com.cloud.user.AccountManager; +import com.cloud.user.AccountVO; +import com.cloud.user.User; +import com.cloud.user.UserVO; +import com.cloud.user.dao.AccountDao; +import com.cloud.user.dao.UserDao; +import com.cloud.utils.component.ManagerBase; +import com.cloud.utils.db.QueryBuilder; +import com.cloud.utils.db.SearchCriteria; +import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.vm.VirtualMachineProfile; +import com.google.gson.Gson; +import org.apache.cloudstack.acl.RoleType; +import org.apache.cloudstack.api.AddBaremetalRctCmd; +import org.apache.cloudstack.api.DeleteBaremetalRctCmd; +import org.apache.cloudstack.api.ListBaremetalRctCmd; +import org.apache.cloudstack.utils.baremetal.BaremetalUtils; +import org.springframework.web.client.RestTemplate; + +import javax.inject.Inject; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +/** + * Created by frank on 5/8/14. + */ +public class BaremetalVlanManagerImpl extends ManagerBase implements BaremetalVlanManager { + private Gson gson = new Gson(); + + @Inject + private BaremetalRctDao rctDao; + @Inject + private HostDao hostDao; + @Inject + private AccountDao acntDao; + @Inject + private UserDao userDao; + @Inject + private AccountManager acntMgr; + + private Map backends; + + private class RackPair { + BaremetalRct.Rack rack; + BaremetalRct.HostEntry host; + } + + public void setBackends(Map backends) { + this.backends = backends; + } + + @Override + public BaremetalRctResponse addRct(AddBaremetalRctCmd cmd) { + try { + List existings = rctDao.listAll(); + if (!existings.isEmpty()) { + throw new CloudRuntimeException(String.format("there is some RCT existing. A CloudStack deployment accepts only one RCT")); + } + URL url = new URL(cmd.getRctUrl()); + RestTemplate rest = new RestTemplate(); + String rctStr = rest.getForObject(url.toString(), String.class); + + // validate it's right format + BaremetalRct rct = gson.fromJson(rctStr, BaremetalRct.class); + QueryBuilder sc = QueryBuilder.create(BaremetalRctVO.class); + sc.and(sc.entity().getUrl(), SearchCriteria.Op.EQ, cmd.getRctUrl()); + BaremetalRctVO vo = sc.find(); + if (vo == null) { + vo = new BaremetalRctVO(); + vo.setRct(gson.toJson(rct)); + vo.setUrl(cmd.getRctUrl()); + vo = rctDao.persist(vo); + } else { + vo.setRct(gson.toJson(rct)); + rctDao.update(vo.getId(), vo); + } + + BaremetalRctResponse rsp = new BaremetalRctResponse(); + rsp.setUrl(vo.getUrl()); + rsp.setId(vo.getUuid()); + rsp.setObjectName("baremetalrct"); + return rsp; + } catch (MalformedURLException e) { + throw new IllegalArgumentException(String.format("%s is not a legal http url", cmd.getRctUrl())); + } + } + + @Override + public void prepareVlan(Network nw, DeployDestination destHost) { + List vos = rctDao.listAll(); + if (vos.isEmpty()) { + throw new CloudRuntimeException("no rack configuration found, please call addBaremetalRct to add one"); + } + + BaremetalRctVO vo = vos.get(0); + BaremetalRct rct = gson.fromJson(vo.getRct(), BaremetalRct.class); + + RackPair rp = findRack(rct, destHost.getHost().getPrivateMacAddress()); + if (rp == null) { + throw new CloudRuntimeException(String.format("cannot find any rack contains host[mac:%s], please double check your rack configuration file, update it and call addBaremetalRct again", destHost.getHost().getPrivateMacAddress())); + } + + int vlan = Integer.parseInt(Networks.BroadcastDomainType.getValue(nw.getBroadcastUri())); + BaremetalSwitchBackend backend = getSwitchBackend(rp.rack.getL2Switch().getType()); + BaremetalVlanStruct struct = new BaremetalVlanStruct(); + struct.setHostMac(rp.host.getMac()); + struct.setPort(rp.host.getPort()); + struct.setSwitchIp(rp.rack.getL2Switch().getIp()); + struct.setSwitchPassword(rp.rack.getL2Switch().getPassword()); + struct.setSwitchType(rp.rack.getL2Switch().getType()); + struct.setSwitchUsername(rp.rack.getL2Switch().getUsername()); + struct.setVlan(vlan); + backend.prepareVlan(struct); + } + + @Override + public void releaseVlan(Network nw, VirtualMachineProfile vm) { + List vos = rctDao.listAll(); + if (vos.isEmpty()) { + throw new CloudRuntimeException("no rack configuration found, please call addBaremetalRct to add one"); + } + + BaremetalRctVO vo = vos.get(0); + BaremetalRct rct = gson.fromJson(vo.getRct(), BaremetalRct.class); + HostVO host = hostDao.findById(vm.getVirtualMachine().getHostId()); + RackPair rp = findRack(rct, host.getPrivateMacAddress()); + assert rp != null : String.format("where is my rack???"); + + int vlan = Integer.parseInt(Networks.BroadcastDomainType.getValue(nw.getBroadcastUri())); + BaremetalVlanStruct struct = new BaremetalVlanStruct(); + struct.setHostMac(rp.host.getMac()); + struct.setPort(rp.host.getPort()); + struct.setSwitchIp(rp.rack.getL2Switch().getIp()); + struct.setSwitchPassword(rp.rack.getL2Switch().getPassword()); + struct.setSwitchType(rp.rack.getL2Switch().getType()); + struct.setSwitchUsername(rp.rack.getL2Switch().getUsername()); + struct.setVlan(vlan); + BaremetalSwitchBackend backend = getSwitchBackend(rp.rack.getL2Switch().getType()); + backend.removePortFromVlan(struct); + } + + @Override + public void registerSwitchBackend(BaremetalSwitchBackend backend) { + backends.put(backend.getSwitchBackendType(), backend); + } + + @Override + public void deleteRct(DeleteBaremetalRctCmd cmd) { + rctDao.remove(cmd.getId()); + } + + @Override + public BaremetalRctResponse listRct() { + List vos = rctDao.listAll(); + if (!vos.isEmpty()) { + BaremetalRctVO vo = vos.get(0); + BaremetalRctResponse rsp = new BaremetalRctResponse(); + rsp.setId(vo.getUuid()); + rsp.setUrl(vo.getUrl()); + rsp.setObjectName("baremetalrct"); + return rsp; + } + return null; + } + + private BaremetalSwitchBackend getSwitchBackend(String type) { + BaremetalSwitchBackend backend = backends.get(type); + if (backend == null) { + throw new CloudRuntimeException(String.format("cannot find switch backend[type:%s]", type)); + } + return backend; + } + + private RackPair findRack(BaremetalRct rct, String mac) { + for (BaremetalRct.Rack rack : rct.getRacks()) { + for (BaremetalRct.HostEntry host : rack.getHosts()) { + if (mac.equals(host.getMac())) { + RackPair p = new RackPair(); + p.host = host; + p.rack = rack; + return p; + } + } + } + return null; + } + + @Override + public String getName() { + return "Baremetal Vlan Manager"; + } + + + @Override + public List> getCommands() { + List> cmds = new ArrayList>(); + cmds.add(AddBaremetalRctCmd.class); + cmds.add(ListBaremetalRctCmd.class); + cmds.add(DeleteBaremetalRctCmd.class); + return cmds; + } + + @Override + public boolean start() { + QueryBuilder acntq = QueryBuilder.create(AccountVO.class); + acntq.and(acntq.entity().getAccountName(), SearchCriteria.Op.EQ, BaremetalUtils.BAREMETAL_SYSTEM_ACCOUNT_NAME); + AccountVO acnt = acntq.find(); + if (acnt != null) { + return true; + } + + acnt = new AccountVO(); + acnt.setAccountName(BaremetalUtils.BAREMETAL_SYSTEM_ACCOUNT_NAME); + acnt.setUuid(UUID.randomUUID().toString()); + acnt.setState(Account.State.ENABLED); + acnt.setDomainId(1); + acnt.setType(RoleType.User.getAccountType()); + acnt.setRoleId(RoleType.User.getId()); + acnt = acntDao.persist(acnt); + + UserVO user = new UserVO(); + user.setState(Account.State.ENABLED); + user.setUuid(UUID.randomUUID().toString()); + user.setAccountId(acnt.getAccountId()); + user.setUsername(BaremetalUtils.BAREMETAL_SYSTEM_ACCOUNT_NAME); + user.setFirstname(BaremetalUtils.BAREMETAL_SYSTEM_ACCOUNT_NAME); + user.setLastname(BaremetalUtils.BAREMETAL_SYSTEM_ACCOUNT_NAME); + user.setPassword(UUID.randomUUID().toString()); + user.setSource(User.Source.UNKNOWN); + user = userDao.persist(user); + + String[] keys = acntMgr.createApiKeyAndSecretKey(user.getId()); + user.setApiKey(keys[0]); + user.setSecretKey(keys[1]); + userDao.update(user.getId(), user); + return true; + } +} diff --git a/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/networkservice/BaremetalRctResponse.java b/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/networkservice/BaremetalRctResponse.java index d1577aa257c..6cdeaedabf9 100644 --- a/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/networkservice/BaremetalRctResponse.java +++ b/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/networkservice/BaremetalRctResponse.java @@ -1,55 +1,55 @@ -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. -// -package com.cloud.baremetal.networkservice; - -import com.cloud.baremetal.database.BaremetalRctVO; -import com.cloud.serializer.Param; -import com.google.gson.annotations.SerializedName; -import org.apache.cloudstack.api.ApiConstants; -import org.apache.cloudstack.api.BaseResponse; -import org.apache.cloudstack.api.EntityReference; - -/** - * Created by frank on 5/8/14. - */ -@EntityReference(value = BaremetalRctVO.class) -public class BaremetalRctResponse extends BaseResponse { - @SerializedName(ApiConstants.ID) - @Param(description = "id of rct") - private String id; - - @SerializedName(ApiConstants.URL) - @Param(description = "url") - private String url; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } -} +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// +package com.cloud.baremetal.networkservice; + +import com.cloud.baremetal.database.BaremetalRctVO; +import com.cloud.serializer.Param; +import com.google.gson.annotations.SerializedName; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.EntityReference; + +/** + * Created by frank on 5/8/14. + */ +@EntityReference(value = BaremetalRctVO.class) +public class BaremetalRctResponse extends BaseResponse { + @SerializedName(ApiConstants.ID) + @Param(description = "id of rct") + private String id; + + @SerializedName(ApiConstants.URL) + @Param(description = "url") + private String url; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } +} diff --git a/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/networkservice/BaremetalSwitchBackend.java b/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/networkservice/BaremetalSwitchBackend.java index 1ad6ee4cade..849db2c5c8f 100644 --- a/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/networkservice/BaremetalSwitchBackend.java +++ b/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/networkservice/BaremetalSwitchBackend.java @@ -1,34 +1,34 @@ -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. -// -// Automatically generated by addcopyright.py at 01/29/2013 -// Apache License, Version 2.0 (the "License"); you may not use this -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// -// Automatically generated by addcopyright.py at 04/03/2012 -package com.cloud.baremetal.networkservice; - -/** - * Created by frank on 9/2/14. - */ -public interface BaremetalSwitchBackend { - String getSwitchBackendType(); - - void prepareVlan(BaremetalVlanStruct struct); - - void removePortFromVlan(BaremetalVlanStruct struct); -} +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// +// Automatically generated by addcopyright.py at 01/29/2013 +// Apache License, Version 2.0 (the "License"); you may not use this +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.baremetal.networkservice; + +/** + * Created by frank on 9/2/14. + */ +public interface BaremetalSwitchBackend { + String getSwitchBackendType(); + + void prepareVlan(BaremetalVlanStruct struct); + + void removePortFromVlan(BaremetalVlanStruct struct); +} diff --git a/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/networkservice/BaremetalVirtualRouterCommands.java b/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/networkservice/BaremetalVirtualRouterCommands.java index 69eccd73c5e..7e8475284eb 100644 --- a/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/networkservice/BaremetalVirtualRouterCommands.java +++ b/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/networkservice/BaremetalVirtualRouterCommands.java @@ -1,122 +1,122 @@ -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. -package com.cloud.baremetal.networkservice; - -/** - * Created by frank on 7/23/14. - */ -public class BaremetalVirtualRouterCommands { - - public abstract static class AgentCommand { - } - - public abstract static class AgentResponse { - private boolean success; - private String error; - - public boolean isSuccess() { - return success; - } - - public void setSuccess(boolean success) { - this.success = success; - } - - public String getError() { - return error; - } - - public void setError(String error) { - this.error = error; - } - } - - public static class PreparePxeCmd extends AgentCommand { - private String guestMac; - private String templateUuid; - private String kickStartUrl; - private String initrdUrl; - private String kernelUrl; - - public String getTemplateUuid() { - return templateUuid; - } - - public void setTemplateUuid(String templateUuid) { - this.templateUuid = templateUuid; - } - - public String getGuestMac() { - return guestMac; - } - - public void setGuestMac(String guestMac) { - this.guestMac = guestMac; - } - - public String getKickStartUrl() { - return kickStartUrl; - } - - public void setKickStartUrl(String kickStartUrl) { - this.kickStartUrl = kickStartUrl; - } - - public String getInitrdUrl() { - return initrdUrl; - } - - public void setInitrdUrl(String initrdUrl) { - this.initrdUrl = initrdUrl; - } - - public String getKernelUrl() { - return kernelUrl; - } - - public void setKernelUrl(String kernelUrl) { - this.kernelUrl = kernelUrl; - } - } - - public static class PreparePxeRsp extends AgentResponse { - } - - public static class PrepareSourceNatCmd extends AgentCommand { - private String internalStorageServerIp; - private String managementNicIp; - - public String getInternalStorageServerIp() { - return internalStorageServerIp; - } - - public void setInternalStorageServerIp(String internalStorageServerIp) { - this.internalStorageServerIp = internalStorageServerIp; - } - - public String getManagementNicIp() { - return managementNicIp; - } - - public void setManagementNicIp(String managementNicIp) { - this.managementNicIp = managementNicIp; - } - } - - public static class PrepareSourceNatRsp extends AgentResponse { - } -} +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.baremetal.networkservice; + +/** + * Created by frank on 7/23/14. + */ +public class BaremetalVirtualRouterCommands { + + public abstract static class AgentCommand { + } + + public abstract static class AgentResponse { + private boolean success; + private String error; + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public String getError() { + return error; + } + + public void setError(String error) { + this.error = error; + } + } + + public static class PreparePxeCmd extends AgentCommand { + private String guestMac; + private String templateUuid; + private String kickStartUrl; + private String initrdUrl; + private String kernelUrl; + + public String getTemplateUuid() { + return templateUuid; + } + + public void setTemplateUuid(String templateUuid) { + this.templateUuid = templateUuid; + } + + public String getGuestMac() { + return guestMac; + } + + public void setGuestMac(String guestMac) { + this.guestMac = guestMac; + } + + public String getKickStartUrl() { + return kickStartUrl; + } + + public void setKickStartUrl(String kickStartUrl) { + this.kickStartUrl = kickStartUrl; + } + + public String getInitrdUrl() { + return initrdUrl; + } + + public void setInitrdUrl(String initrdUrl) { + this.initrdUrl = initrdUrl; + } + + public String getKernelUrl() { + return kernelUrl; + } + + public void setKernelUrl(String kernelUrl) { + this.kernelUrl = kernelUrl; + } + } + + public static class PreparePxeRsp extends AgentResponse { + } + + public static class PrepareSourceNatCmd extends AgentCommand { + private String internalStorageServerIp; + private String managementNicIp; + + public String getInternalStorageServerIp() { + return internalStorageServerIp; + } + + public void setInternalStorageServerIp(String internalStorageServerIp) { + this.internalStorageServerIp = internalStorageServerIp; + } + + public String getManagementNicIp() { + return managementNicIp; + } + + public void setManagementNicIp(String managementNicIp) { + this.managementNicIp = managementNicIp; + } + } + + public static class PrepareSourceNatRsp extends AgentResponse { + } +} diff --git a/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/networkservice/BaremetalVlanStruct.java b/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/networkservice/BaremetalVlanStruct.java index 32d9b33a344..9ebd4128636 100644 --- a/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/networkservice/BaremetalVlanStruct.java +++ b/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/networkservice/BaremetalVlanStruct.java @@ -1,92 +1,92 @@ -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. -// -// Automatically generated by addcopyright.py at 01/29/2013 -// Apache License, Version 2.0 (the "License"); you may not use this -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// -// Automatically generated by addcopyright.py at 04/03/2012 -package com.cloud.baremetal.networkservice; - -/** - * Created by frank on 9/2/14. - */ -public class BaremetalVlanStruct { - private String switchType; - private String switchIp; - private String switchUsername; - private String switchPassword; - private String hostMac; - private String port; - private int vlan; - - public String getSwitchType() { - return switchType; - } - - public void setSwitchType(String switchType) { - this.switchType = switchType; - } - - public String getSwitchIp() { - return switchIp; - } - - public void setSwitchIp(String switchIp) { - this.switchIp = switchIp; - } - - public String getSwitchUsername() { - return switchUsername; - } - - public void setSwitchUsername(String switchUsername) { - this.switchUsername = switchUsername; - } - - public String getSwitchPassword() { - return switchPassword; - } - - public void setSwitchPassword(String switchPassword) { - this.switchPassword = switchPassword; - } - - public String getHostMac() { - return hostMac; - } - - public void setHostMac(String hostMac) { - this.hostMac = hostMac; - } - - public String getPort() { - return port; - } - - public void setPort(String port) { - this.port = port; - } - - public int getVlan() { - return vlan; - } - - public void setVlan(int vlan) { - this.vlan = vlan; - } -} +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// +// Automatically generated by addcopyright.py at 01/29/2013 +// Apache License, Version 2.0 (the "License"); you may not use this +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.baremetal.networkservice; + +/** + * Created by frank on 9/2/14. + */ +public class BaremetalVlanStruct { + private String switchType; + private String switchIp; + private String switchUsername; + private String switchPassword; + private String hostMac; + private String port; + private int vlan; + + public String getSwitchType() { + return switchType; + } + + public void setSwitchType(String switchType) { + this.switchType = switchType; + } + + public String getSwitchIp() { + return switchIp; + } + + public void setSwitchIp(String switchIp) { + this.switchIp = switchIp; + } + + public String getSwitchUsername() { + return switchUsername; + } + + public void setSwitchUsername(String switchUsername) { + this.switchUsername = switchUsername; + } + + public String getSwitchPassword() { + return switchPassword; + } + + public void setSwitchPassword(String switchPassword) { + this.switchPassword = switchPassword; + } + + public String getHostMac() { + return hostMac; + } + + public void setHostMac(String hostMac) { + this.hostMac = hostMac; + } + + public String getPort() { + return port; + } + + public void setPort(String port) { + this.port = port; + } + + public int getVlan() { + return vlan; + } + + public void setVlan(int vlan) { + this.vlan = vlan; + } +} diff --git a/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/networkservice/Force10BaremetalSwitchBackend.java b/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/networkservice/Force10BaremetalSwitchBackend.java index 30197bfc91d..e4dd5b1a5d8 100644 --- a/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/networkservice/Force10BaremetalSwitchBackend.java +++ b/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/networkservice/Force10BaremetalSwitchBackend.java @@ -1,56 +1,56 @@ -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. -// -// Automatically generated by addcopyright.py at 01/29/2013 -// Apache License, Version 2.0 (the "License"); you may not use this -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// -// Automatically generated by addcopyright.py at 04/03/2012 -package com.cloud.baremetal.networkservice; - -import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.xmlobject.XmlObject; -import com.cloud.utils.xmlobject.XmlObjectParser; -import org.apache.commons.codec.binary.Base64; -import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.HttpStatus; +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// +// Automatically generated by addcopyright.py at 01/29/2013 +// Apache License, Version 2.0 (the "License"); you may not use this +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.baremetal.networkservice; + +import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.utils.xmlobject.XmlObject; +import com.cloud.utils.xmlobject.XmlObjectParser; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.lang3.StringUtils; +import org.apache.log4j.Logger; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; +import org.springframework.http.ResponseEntity; import org.springframework.http.client.ClientHttpResponse; import org.springframework.web.client.ResponseErrorHandler; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.util.UriComponentsBuilder; - +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponentsBuilder; + import java.io.IOException; -import java.util.ArrayList; +import java.util.ArrayList; import java.util.Arrays; -import java.util.List; - -/** - * Created by frank on 9/2/14. - */ -public class Force10BaremetalSwitchBackend implements BaremetalSwitchBackend { - private Logger logger = Logger.getLogger(Force10BaremetalSwitchBackend.class); - public static final String TYPE = "Force10"; - +import java.util.List; + +/** + * Created by frank on 9/2/14. + */ +public class Force10BaremetalSwitchBackend implements BaremetalSwitchBackend { + private Logger logger = Logger.getLogger(Force10BaremetalSwitchBackend.class); + public static final String TYPE = "Force10"; + private static List successHttpStatusCode = new ArrayList<>(); { successHttpStatusCode.add(HttpStatus.OK); @@ -62,7 +62,7 @@ public class Force10BaremetalSwitchBackend implements BaremetalSwitchBackend { successHttpStatusCode.add(HttpStatus.ALREADY_REPORTED); } - RestTemplate rest = new RestTemplate(); + RestTemplate rest = new RestTemplate(); { // fake error handler, we handle error in business logic code rest.setErrorHandler(new ResponseErrorHandler() { @@ -70,7 +70,7 @@ public class Force10BaremetalSwitchBackend implements BaremetalSwitchBackend { public boolean hasError(ClientHttpResponse clientHttpResponse) throws IOException { return false; } - + @Override public void handleError(ClientHttpResponse clientHttpResponse) throws IOException { } @@ -78,29 +78,29 @@ public class Force10BaremetalSwitchBackend implements BaremetalSwitchBackend { } private String buildLink(String switchIp, String path) { - UriComponentsBuilder builder = UriComponentsBuilder.newInstance(); - builder.scheme("http"); - builder.host(switchIp); - builder.port(8008); + UriComponentsBuilder builder = UriComponentsBuilder.newInstance(); + builder.scheme("http"); + builder.host(switchIp); + builder.port(8008); builder.path(path); - return builder.build().toUriString(); - } - - @Override - public String getSwitchBackendType() { - return TYPE; - } - - @Override - public void prepareVlan(BaremetalVlanStruct struct) { + return builder.build().toUriString(); + } + + @Override + public String getSwitchBackendType() { + return TYPE; + } + + @Override + public void prepareVlan(BaremetalVlanStruct struct) { String link = buildLink(struct.getSwitchIp(), String.format("/api/running/ftos/interface/vlan/%s", struct.getVlan())); - HttpHeaders headers = createBasicAuthenticationHeader(struct); - HttpEntity request = new HttpEntity<>(headers); - ResponseEntity rsp = rest.exchange(link, HttpMethod.GET, request, String.class); + HttpHeaders headers = createBasicAuthenticationHeader(struct); + HttpEntity request = new HttpEntity<>(headers); + ResponseEntity rsp = rest.exchange(link, HttpMethod.GET, request, String.class); logger.debug(String.format("http get: %s", link)); - - if (rsp.getStatusCode() == HttpStatus.NOT_FOUND) { - PortInfo port = new PortInfo(struct); + + if (rsp.getStatusCode() == HttpStatus.NOT_FOUND) { + PortInfo port = new PortInfo(struct); XmlObject xml = new XmlObject("vlan").putElement("vlan-id", new XmlObject("vlan-id").setText(String.valueOf(struct.getVlan()))).putElement("untagged", new XmlObject("untagged").putElement(port.interfaceType, new XmlObject(port.interfaceType) @@ -111,26 +111,26 @@ public class Force10BaremetalSwitchBackend implements BaremetalSwitchBackend { logger.debug(String.format("http get: %s, body: %s", link, request)); rsp = rest.exchange(link, HttpMethod.POST, request, String.class); if (!successHttpStatusCode.contains(rsp.getStatusCode())) { - throw new CloudRuntimeException(String.format("unable to create vlan[%s] on force10 switch[ip:%s]. HTTP status code:%s, body dump:%s", + throw new CloudRuntimeException(String.format("unable to create vlan[%s] on force10 switch[ip:%s]. HTTP status code:%s, body dump:%s", struct.getVlan(), struct.getSwitchIp(),rsp.getStatusCode(), rsp.getBody())); } else { logger.debug(String.format("successfully programmed vlan[%s] on Force10[ip:%s, port:%s]. http response[status code:%s, body:%s]", struct.getVlan(), struct.getSwitchIp(), struct.getPort(), rsp.getStatusCode(), rsp.getBody())); - } + } } else if (successHttpStatusCode.contains(rsp.getStatusCode())) { - PortInfo port = new PortInfo(struct); - XmlObject xml = XmlObjectParser.parseFromString((String)rsp.getBody()); + PortInfo port = new PortInfo(struct); + XmlObject xml = XmlObjectParser.parseFromString((String)rsp.getBody()); List ports = xml.getAsList("untagged.tengigabitethernet"); ports.addAll(xml.getAsList("untagged.gigabitethernet")); ports.addAll(xml.getAsList("untagged.fortyGigE")); - for (XmlObject pxml : ports) { - XmlObject name = pxml.get("name"); - if (port.port.equals(name.getText())) { - logger.debug(String.format("port[%s] has joined in vlan[%s], no need to program again", struct.getPort(), struct.getVlan())); - return; - } - } - + for (XmlObject pxml : ports) { + XmlObject name = pxml.get("name"); + if (port.port.equals(name.getText())) { + logger.debug(String.format("port[%s] has joined in vlan[%s], no need to program again", struct.getPort(), struct.getVlan())); + return; + } + } + xml.removeElement("mtu"); xml.setText(null); XmlObject tag = xml.get("untagged"); @@ -144,51 +144,51 @@ public class Force10BaremetalSwitchBackend implements BaremetalSwitchBackend { request = new HttpEntity<>(xml.dump(), headers); link = buildLink(struct.getSwitchIp(), String.format("/api/running/ftos/interface/vlan/%s", struct.getVlan())); logger.debug(String.format("http get: %s, body: %s", link, request)); - rsp = rest.exchange(link, HttpMethod.PUT, request, String.class); + rsp = rest.exchange(link, HttpMethod.PUT, request, String.class); if (!successHttpStatusCode.contains(rsp.getStatusCode())) { - throw new CloudRuntimeException(String.format("failed to program vlan[%s] for port[%s] on force10[ip:%s]. http status:%s, body dump:%s", - struct.getVlan(), struct.getPort(), struct.getSwitchIp(), rsp.getStatusCode(), rsp.getBody())); + throw new CloudRuntimeException(String.format("failed to program vlan[%s] for port[%s] on force10[ip:%s]. http status:%s, body dump:%s", + struct.getVlan(), struct.getPort(), struct.getSwitchIp(), rsp.getStatusCode(), rsp.getBody())); } else { logger.debug(String.format("successfully join port[%s] into vlan[%s] on Force10[ip:%s]. http response[status code:%s, body:%s]", struct.getPort(), struct.getVlan(), struct.getSwitchIp(), rsp.getStatusCode(), rsp.getBody())); - } - } else { - throw new CloudRuntimeException(String.format("force10[ip:%s] returns unexpected error[%s] when http getting %s, body dump:%s", - struct.getSwitchIp(), rsp.getStatusCode(), link, rsp.getBody())); - } - } - - @Override - public void removePortFromVlan(BaremetalVlanStruct struct) { + } + } else { + throw new CloudRuntimeException(String.format("force10[ip:%s] returns unexpected error[%s] when http getting %s, body dump:%s", + struct.getSwitchIp(), rsp.getStatusCode(), link, rsp.getBody())); + } + } + + @Override + public void removePortFromVlan(BaremetalVlanStruct struct) { String link = buildLink(struct.getSwitchIp(), String.format("/api/running/ftos/interface/vlan/%s", struct.getVlan())); - HttpHeaders headers = createBasicAuthenticationHeader(struct); - HttpEntity request = new HttpEntity<>(headers); + HttpHeaders headers = createBasicAuthenticationHeader(struct); + HttpEntity request = new HttpEntity<>(headers); logger.debug(String.format("http get: %s, body: %s", link, request)); - ResponseEntity rsp = rest.exchange(link, HttpMethod.GET, request, String.class); - if (rsp.getStatusCode() == HttpStatus.NOT_FOUND) { - logger.debug(String.format("vlan[%s] has been deleted on force10[ip:%s], no need to remove the port[%s] anymore", struct.getVlan(), struct.getSwitchIp(), struct.getPort())); - } else if (rsp.getStatusCode() == HttpStatus.OK) { - PortInfo port = new PortInfo(struct); - XmlObject xml = XmlObjectParser.parseFromString((String)rsp.getBody()); + ResponseEntity rsp = rest.exchange(link, HttpMethod.GET, request, String.class); + if (rsp.getStatusCode() == HttpStatus.NOT_FOUND) { + logger.debug(String.format("vlan[%s] has been deleted on force10[ip:%s], no need to remove the port[%s] anymore", struct.getVlan(), struct.getSwitchIp(), struct.getPort())); + } else if (rsp.getStatusCode() == HttpStatus.OK) { + PortInfo port = new PortInfo(struct); + XmlObject xml = XmlObjectParser.parseFromString((String)rsp.getBody()); List ports = xml.getAsList("untagged.tengigabitethernet"); ports.addAll(xml.getAsList("untagged.gigabitethernet")); ports.addAll(xml.getAsList("untagged.fortyGigE")); - List newPorts = new ArrayList<>(); - boolean needRemove = false; - for (XmlObject pxml : ports) { - XmlObject name = pxml.get("name"); - if (port.port.equals(name.getText())) { - needRemove = true; - continue; - } - - newPorts.add(pxml); - } - - if (!needRemove) { - return; - } - + List newPorts = new ArrayList<>(); + boolean needRemove = false; + for (XmlObject pxml : ports) { + XmlObject name = pxml.get("name"); + if (port.port.equals(name.getText())) { + needRemove = true; + continue; + } + + newPorts.add(pxml); + } + + if (!needRemove) { + return; + } + xml.setText(null); xml.removeElement("mtu"); XmlObject tagged = xml.get("untagged"); @@ -197,56 +197,56 @@ public class Force10BaremetalSwitchBackend implements BaremetalSwitchBackend { tagged.putElement(p.getTag(), p); } - + request = new HttpEntity<>(xml.dump(), headers); logger.debug(String.format("http get: %s, body: %s", link, request)); - rsp = rest.exchange(link, HttpMethod.PUT, request, String.class); + rsp = rest.exchange(link, HttpMethod.PUT, request, String.class); if (!successHttpStatusCode.contains(rsp.getStatusCode())) { - throw new CloudRuntimeException(String.format("failed to program vlan[%s] for port[%s] on force10[ip:%s]. http status:%s, body dump:%s", - struct.getVlan(), struct.getPort(), struct.getSwitchIp(), rsp.getStatusCode(), rsp.getBody())); - } else { - logger.debug(String.format("removed port[%s] from vlan[%s] on force10[ip:%s]", struct.getPort(), struct.getVlan(), struct.getSwitchIp())); - } - } else { - throw new CloudRuntimeException(String.format("force10[ip:%s] returns unexpected error[%s] when http getting %s, body dump:%s", - struct.getSwitchIp(), rsp.getStatusCode(), link, rsp.getBody())); - } - } - - private HttpHeaders createBasicAuthenticationHeader(BaremetalVlanStruct struct) { - String plainCreds = String.format("%s:%s", struct.getSwitchUsername(), struct.getSwitchPassword()); - byte[] plainCredsBytes = plainCreds.getBytes(); - byte[] base64CredsBytes = Base64.encodeBase64(plainCredsBytes); - String base64Creds = new String(base64CredsBytes); - HttpHeaders headers = new HttpHeaders(); - headers.add("Authorization", "Basic " + base64Creds); + throw new CloudRuntimeException(String.format("failed to program vlan[%s] for port[%s] on force10[ip:%s]. http status:%s, body dump:%s", + struct.getVlan(), struct.getPort(), struct.getSwitchIp(), rsp.getStatusCode(), rsp.getBody())); + } else { + logger.debug(String.format("removed port[%s] from vlan[%s] on force10[ip:%s]", struct.getPort(), struct.getVlan(), struct.getSwitchIp())); + } + } else { + throw new CloudRuntimeException(String.format("force10[ip:%s] returns unexpected error[%s] when http getting %s, body dump:%s", + struct.getSwitchIp(), rsp.getStatusCode(), link, rsp.getBody())); + } + } + + private HttpHeaders createBasicAuthenticationHeader(BaremetalVlanStruct struct) { + String plainCreds = String.format("%s:%s", struct.getSwitchUsername(), struct.getSwitchPassword()); + byte[] plainCredsBytes = plainCreds.getBytes(); + byte[] base64CredsBytes = Base64.encodeBase64(plainCredsBytes); + String base64Creds = new String(base64CredsBytes); + HttpHeaders headers = new HttpHeaders(); + headers.add("Authorization", "Basic " + base64Creds); headers.setAccept(Arrays.asList(MediaType.ALL)); headers.setContentType(MediaType.valueOf("application/vnd.yang.data+xml")); - return headers; - } - - private class PortInfo { - static final String G_IFACE = "gigabitethernet"; - static final String TEN_G_IFACE = "tengigabitethernet"; - static final String FOURTY_G_IFACE = "fortyGigE"; - - private String interfaceType; - private String port; - - PortInfo(BaremetalVlanStruct struct) { - String[] ps = StringUtils.split(struct.getPort(), ":"); - if (ps.length == 1) { - interfaceType = TEN_G_IFACE; - port = ps[0]; - } else if (ps.length == 2) { - interfaceType = ps[0]; - if (!interfaceType.equals(G_IFACE) && !interfaceType.equals(TEN_G_IFACE) && !interfaceType.equals(FOURTY_G_IFACE)) { - throw new CloudRuntimeException(String.format("wrong port definition[%s]. The prefix must be one of [%s,%s,%s]", struct.getPort(), G_IFACE, TEN_G_IFACE, FOURTY_G_IFACE)); - } - port = ps[1]; - } else { - throw new CloudRuntimeException(String.format("wrong port definition[%s]. Force10 port should be in format of interface_type:port_identity, for example: tengigabitethernet:1/3", struct.getPort())); - } - } - } -} + return headers; + } + + private class PortInfo { + static final String G_IFACE = "gigabitethernet"; + static final String TEN_G_IFACE = "tengigabitethernet"; + static final String FOURTY_G_IFACE = "fortyGigE"; + + private String interfaceType; + private String port; + + PortInfo(BaremetalVlanStruct struct) { + String[] ps = StringUtils.split(struct.getPort(), ":"); + if (ps.length == 1) { + interfaceType = TEN_G_IFACE; + port = ps[0]; + } else if (ps.length == 2) { + interfaceType = ps[0]; + if (!interfaceType.equals(G_IFACE) && !interfaceType.equals(TEN_G_IFACE) && !interfaceType.equals(FOURTY_G_IFACE)) { + throw new CloudRuntimeException(String.format("wrong port definition[%s]. The prefix must be one of [%s,%s,%s]", struct.getPort(), G_IFACE, TEN_G_IFACE, FOURTY_G_IFACE)); + } + port = ps[1]; + } else { + throw new CloudRuntimeException(String.format("wrong port definition[%s]. Force10 port should be in format of interface_type:port_identity, for example: tengigabitethernet:1/3", struct.getPort())); + } + } + } +} diff --git a/plugins/hypervisors/baremetal/src/main/resources/security_group_agent/security_group_agent/cs_sg_agent.py b/plugins/hypervisors/baremetal/src/main/resources/security_group_agent/security_group_agent/cs_sg_agent.py index 65307999eff..2933a819395 100755 --- a/plugins/hypervisors/baremetal/src/main/resources/security_group_agent/security_group_agent/cs_sg_agent.py +++ b/plugins/hypervisors/baremetal/src/main/resources/security_group_agent/security_group_agent/cs_sg_agent.py @@ -1,236 +1,236 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# -# Automatically generated by addcopyright.py at 01/29/2013 -''' -Created on Jan 2, 2013 - -@author: frank -''' -import cherrypy -import sglib -import xmlobject -import types -import uuid -import os.path -import sys -import os - -class SGRule(object): - def __init__(self): - self.protocol = None - self.start_port = None - self.end_port = None - self.allowed_ips = [] - -class IPSet(object): - IPSET_TYPE = 'hash:ip' - def __init__(self, setname, ips): - self.ips = ips - self.name = setname - - def create(self): - tmpname = str(uuid.uuid4()).replace('-', '')[0:30] - sglib.ShellCmd('ipset -N %s %s' % (tmpname, self.IPSET_TYPE))() - try: - for ip in self.ips: - sglib.ShellCmd('ipset -A %s %s' % (tmpname, ip))() - - try: - sglib.ShellCmd('ipset -N %s %s' % (self.name, self.IPSET_TYPE))() - cherrypy.log('created new ipset: %s' % self.name) - except Exception: - cherrypy.log('%s already exists, no need to create new' % self.name) - finally: - sglib.ShellCmd('ipset -W %s %s' % (tmpname, self.name))() - sglib.ShellCmd('ipset -F %s' % tmpname)() - sglib.ShellCmd('ipset -X %s' % tmpname)() - - @staticmethod - def destroy_sets(sets_to_keep): - sets = sglib.ShellCmd('ipset list')() - for s in sets.split('\n'): - if 'Name:' in s: - set_name = s.split(':', 1)[1].strip() - if not set_name in sets_to_keep: - sglib.ShellCmd('ipset destroy %s' % set_name)() - cherrypy.log('destroyed unused ipset: %s' % set_name) - -class SGAgent(object): - def __init__(self): - pass - - def _self_list(self, obj): - if isinstance(obj, types.ListType): - return obj - else: - return [obj] - - def set_rules(self, req): - body = req.body - doc = xmlobject.loads(body) - vm_name = doc.vmName.text_ - vm_id = doc.vmId.text_ - vm_ip = doc.vmIp.text_ - vm_mac = doc.vmMac.text_ - sig = doc.signature.text_ - seq = doc.sequenceNumber.text_ - - def parse_rules(rules, lst): - for i in self._self_list(rules): - r = SGRule() - r.protocol = i.protocol.text_ - r.start_port = i.startPort.text_ - r.end_port = i.endPort.text_ - if hasattr(i, 'ip'): - for ip in self._self_list(i.ip): - r.allowed_ips.append(ip.text_) - lst.append(r) - - i_rules = [] - if hasattr(doc, 'ingressRules'): - parse_rules(doc.ingressRules, i_rules) - - e_rules = [] - if hasattr(doc, 'egressRules'): - parse_rules(doc.egressRules, e_rules) - - def create_chain(name): - try: - sglib.ShellCmd('iptables -F %s' % name)() - except Exception: - sglib.ShellCmd('iptables -N %s' % name)() - - def apply_rules(rules, chainname, direction, action, current_set_names): - create_chain(chainname) - for r in i_rules: - allow_any = False - if '0.0.0.0/0' in r.allowed_ips: - allow_any = True - r.allowed_ips.remove('0.0.0.0/0') - - if r.allowed_ips: - setname = '_'.join([chainname, r.protocol, r.start_port, r.end_port]) - ipset = IPSet(setname, r.allowed_ips) - ipset.create() - current_set_names.append(setname) - - if r.protocol == 'all': - cmd = ['iptables -I', chainname, '-m state --state NEW -m set --set', setname, direction, '-j', action] - sglib.ShellCmd(' '.join(cmd))() - elif r.protocol != 'icmp': - port_range = ":".join([r.start_port, r.end_port]) - cmd = ['iptables', '-I', chainname, '-p', r.protocol, '-m', r.protocol, '--dport', port_range, '-m state --state NEW -m set --set', setname, direction, '-j', action] - sglib.ShellCmd(' '.join(cmd))() - else: - port_range = "/".join([r.start_port, r.end_port]) - if r.start_port == "-1": - port_range = "any" - cmd = ['iptables', '-I', i_chain_name, '-p', 'icmp', '--icmp-type', port_range, '-m set --set', setname, direction, '-j', action] - sglib.ShellCmd(' '.join(cmd))() - - - if allow_any and r.protocol != 'all': - if r.protocol != 'icmp': - port_range = ":".join([r.start_port, r.end_port]) - cmd = ['iptables', '-I', chainname, '-p', r.protocol, '-m', r.protocol, '--dport', port_range, '-m', 'state', '--state', 'NEW', '-j', action] - sglib.ShellCmd(' '.join(cmd))() - else: - port_range = "/".join([r.start_port, r.end_port]) - if r.start_port == "-1": - port_range = "any" - cmd = ['iptables', '-I', i_chain_name, '-p', 'icmp', '--icmp-type', port_range, '-j', action] - sglib.ShellCmd(' '.join(cmd))() - - current_sets = [] - i_chain_name = vm_name + '-in' - apply_rules(i_rules, i_chain_name, 'src', 'ACCEPT', current_sets) - e_chain_name = vm_name + '-eg' - apply_rules(e_rules, e_chain_name, 'dst', 'RETURN', current_sets) - - if e_rules: - sglib.ShellCmd('iptables -A %s -j RETURN' % e_chain_name) - else: - sglib.ShellCmd('iptables -A %s -j DROP' % e_chain_name) - - sglib.ShellCmd('iptables -A %s -j DROP' % i_chain_name) - IPSet.destroy_sets(current_sets) - - - def echo(self, req): - cherrypy.log("echo: I am alive") - - def index(self): - req = sglib.Request.from_cherrypy_request(cherrypy.request) - cmd_name = req.headers['command'] - - if not hasattr(self, cmd_name): - raise ValueError("SecurityGroupAgent doesn't have a method called '%s'" % cmd_name) - method = getattr(self, cmd_name) - - return method(req) - index.exposed = True - - @staticmethod - def start(): - cherrypy.log.access_file = '/var/log/cs-securitygroup.log' - cherrypy.log.error_file = '/var/log/cs-securitygroup.log' - cherrypy.server.socket_host = '0.0.0.0' - cherrypy.server.socket_port = 9988 - cherrypy.quickstart(SGAgent()) - - @staticmethod - def stop(): - cherrypy.engine.exit() - -PID_FILE = '/var/run/cssgagent.pid' -class SGAgentDaemon(sglib.Daemon): - def __init__(self): - super(SGAgentDaemon, self).__init__(PID_FILE) - self.is_stopped = False - self.agent = SGAgent() - sglib.Daemon.register_atexit_hook(self._do_stop) - - def _do_stop(self): - if self.is_stopped: - return - self.is_stopped = True - self.agent.stop() - - def run(self): - self.agent.start() - - def stop(self): - self.agent.stop() - super(SGAgentDaemon, self).stop() - -def main(): - usage = 'usage: python -c "from security_group_agent import cs_sg_agent; cs_sg_agent.main()" start|stop|restart' - if len(sys.argv) != 2 or not sys.argv[1] in ['start', 'stop', 'restart']: - print usage - sys.exit(1) - - cmd = sys.argv[1] - agentdaemon = SGAgentDaemon() - if cmd == 'start': - agentdaemon.start() - elif cmd == 'stop': - agentdaemon.stop() - else: - agentdaemon.restart() - - sys.exit(0) +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# +# Automatically generated by addcopyright.py at 01/29/2013 +''' +Created on Jan 2, 2013 + +@author: frank +''' +import cherrypy +import sglib +import xmlobject +import types +import uuid +import os.path +import sys +import os + +class SGRule(object): + def __init__(self): + self.protocol = None + self.start_port = None + self.end_port = None + self.allowed_ips = [] + +class IPSet(object): + IPSET_TYPE = 'hash:ip' + def __init__(self, setname, ips): + self.ips = ips + self.name = setname + + def create(self): + tmpname = str(uuid.uuid4()).replace('-', '')[0:30] + sglib.ShellCmd('ipset -N %s %s' % (tmpname, self.IPSET_TYPE))() + try: + for ip in self.ips: + sglib.ShellCmd('ipset -A %s %s' % (tmpname, ip))() + + try: + sglib.ShellCmd('ipset -N %s %s' % (self.name, self.IPSET_TYPE))() + cherrypy.log('created new ipset: %s' % self.name) + except Exception: + cherrypy.log('%s already exists, no need to create new' % self.name) + finally: + sglib.ShellCmd('ipset -W %s %s' % (tmpname, self.name))() + sglib.ShellCmd('ipset -F %s' % tmpname)() + sglib.ShellCmd('ipset -X %s' % tmpname)() + + @staticmethod + def destroy_sets(sets_to_keep): + sets = sglib.ShellCmd('ipset list')() + for s in sets.split('\n'): + if 'Name:' in s: + set_name = s.split(':', 1)[1].strip() + if not set_name in sets_to_keep: + sglib.ShellCmd('ipset destroy %s' % set_name)() + cherrypy.log('destroyed unused ipset: %s' % set_name) + +class SGAgent(object): + def __init__(self): + pass + + def _self_list(self, obj): + if isinstance(obj, types.ListType): + return obj + else: + return [obj] + + def set_rules(self, req): + body = req.body + doc = xmlobject.loads(body) + vm_name = doc.vmName.text_ + vm_id = doc.vmId.text_ + vm_ip = doc.vmIp.text_ + vm_mac = doc.vmMac.text_ + sig = doc.signature.text_ + seq = doc.sequenceNumber.text_ + + def parse_rules(rules, lst): + for i in self._self_list(rules): + r = SGRule() + r.protocol = i.protocol.text_ + r.start_port = i.startPort.text_ + r.end_port = i.endPort.text_ + if hasattr(i, 'ip'): + for ip in self._self_list(i.ip): + r.allowed_ips.append(ip.text_) + lst.append(r) + + i_rules = [] + if hasattr(doc, 'ingressRules'): + parse_rules(doc.ingressRules, i_rules) + + e_rules = [] + if hasattr(doc, 'egressRules'): + parse_rules(doc.egressRules, e_rules) + + def create_chain(name): + try: + sglib.ShellCmd('iptables -F %s' % name)() + except Exception: + sglib.ShellCmd('iptables -N %s' % name)() + + def apply_rules(rules, chainname, direction, action, current_set_names): + create_chain(chainname) + for r in i_rules: + allow_any = False + if '0.0.0.0/0' in r.allowed_ips: + allow_any = True + r.allowed_ips.remove('0.0.0.0/0') + + if r.allowed_ips: + setname = '_'.join([chainname, r.protocol, r.start_port, r.end_port]) + ipset = IPSet(setname, r.allowed_ips) + ipset.create() + current_set_names.append(setname) + + if r.protocol == 'all': + cmd = ['iptables -I', chainname, '-m state --state NEW -m set --set', setname, direction, '-j', action] + sglib.ShellCmd(' '.join(cmd))() + elif r.protocol != 'icmp': + port_range = ":".join([r.start_port, r.end_port]) + cmd = ['iptables', '-I', chainname, '-p', r.protocol, '-m', r.protocol, '--dport', port_range, '-m state --state NEW -m set --set', setname, direction, '-j', action] + sglib.ShellCmd(' '.join(cmd))() + else: + port_range = "/".join([r.start_port, r.end_port]) + if r.start_port == "-1": + port_range = "any" + cmd = ['iptables', '-I', i_chain_name, '-p', 'icmp', '--icmp-type', port_range, '-m set --set', setname, direction, '-j', action] + sglib.ShellCmd(' '.join(cmd))() + + + if allow_any and r.protocol != 'all': + if r.protocol != 'icmp': + port_range = ":".join([r.start_port, r.end_port]) + cmd = ['iptables', '-I', chainname, '-p', r.protocol, '-m', r.protocol, '--dport', port_range, '-m', 'state', '--state', 'NEW', '-j', action] + sglib.ShellCmd(' '.join(cmd))() + else: + port_range = "/".join([r.start_port, r.end_port]) + if r.start_port == "-1": + port_range = "any" + cmd = ['iptables', '-I', i_chain_name, '-p', 'icmp', '--icmp-type', port_range, '-j', action] + sglib.ShellCmd(' '.join(cmd))() + + current_sets = [] + i_chain_name = vm_name + '-in' + apply_rules(i_rules, i_chain_name, 'src', 'ACCEPT', current_sets) + e_chain_name = vm_name + '-eg' + apply_rules(e_rules, e_chain_name, 'dst', 'RETURN', current_sets) + + if e_rules: + sglib.ShellCmd('iptables -A %s -j RETURN' % e_chain_name) + else: + sglib.ShellCmd('iptables -A %s -j DROP' % e_chain_name) + + sglib.ShellCmd('iptables -A %s -j DROP' % i_chain_name) + IPSet.destroy_sets(current_sets) + + + def echo(self, req): + cherrypy.log("echo: I am alive") + + def index(self): + req = sglib.Request.from_cherrypy_request(cherrypy.request) + cmd_name = req.headers['command'] + + if not hasattr(self, cmd_name): + raise ValueError("SecurityGroupAgent doesn't have a method called '%s'" % cmd_name) + method = getattr(self, cmd_name) + + return method(req) + index.exposed = True + + @staticmethod + def start(): + cherrypy.log.access_file = '/var/log/cs-securitygroup.log' + cherrypy.log.error_file = '/var/log/cs-securitygroup.log' + cherrypy.server.socket_host = '0.0.0.0' + cherrypy.server.socket_port = 9988 + cherrypy.quickstart(SGAgent()) + + @staticmethod + def stop(): + cherrypy.engine.exit() + +PID_FILE = '/var/run/cssgagent.pid' +class SGAgentDaemon(sglib.Daemon): + def __init__(self): + super(SGAgentDaemon, self).__init__(PID_FILE) + self.is_stopped = False + self.agent = SGAgent() + sglib.Daemon.register_atexit_hook(self._do_stop) + + def _do_stop(self): + if self.is_stopped: + return + self.is_stopped = True + self.agent.stop() + + def run(self): + self.agent.start() + + def stop(self): + self.agent.stop() + super(SGAgentDaemon, self).stop() + +def main(): + usage = 'usage: python -c "from security_group_agent import cs_sg_agent; cs_sg_agent.main()" start|stop|restart' + if len(sys.argv) != 2 or not sys.argv[1] in ['start', 'stop', 'restart']: + print usage + sys.exit(1) + + cmd = sys.argv[1] + agentdaemon = SGAgentDaemon() + if cmd == 'start': + agentdaemon.start() + elif cmd == 'stop': + agentdaemon.stop() + else: + agentdaemon.restart() + + sys.exit(0) diff --git a/plugins/hypervisors/baremetal/src/main/resources/security_group_agent/security_group_agent/xmlobject.py b/plugins/hypervisors/baremetal/src/main/resources/security_group_agent/security_group_agent/xmlobject.py index 8068318fbb0..78cde68ed36 100755 --- a/plugins/hypervisors/baremetal/src/main/resources/security_group_agent/security_group_agent/xmlobject.py +++ b/plugins/hypervisors/baremetal/src/main/resources/security_group_agent/security_group_agent/xmlobject.py @@ -1,97 +1,97 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# -# Automatically generated by addcopyright.py at 01/29/2013 -''' -Created on Dec 25, 2012 - -@author: Frank -''' -import xml.etree.ElementTree as etree -import re -import types - -class XmlObject(object): - def __init__(self, tag): - self.__tag_name__ = tag - - def put_attr(self, name, val): - val = val.strip().strip('\t') - setattr(self, name + '_', val) - - def put_text(self, val): - val = val.strip().strip('\n').strip('\t') - if val == "": - setattr(self, 'text_', None) - else: - setattr(self, 'text_', val) - - def put_node(self, name, val): - if not hasattr(self, name): - setattr(self, name, val) - return - - nodes = getattr(self, name) - if not isinstance(nodes, types.ListType): - nodes = [] - old = getattr(self, name) - nodes.append(old) - nodes.append(val) - setattr(self, name, nodes) - else: - nodes.append(val) - setattr(self, name, nodes) - - def get(self, name, default=None): - if hasattr(self, name): - val = getattr(self, name) - if name.endswith('_'): - return val - else: - return val.text_ - else: - return default - - def __getattr__(self, name): - if name.endswith('__'): - n = name[:-1] - if hasattr(self, n): - return getattr(self, n) - else: - return None - else: - e = AttributeError('%s has no attribute %s. missing attribute %s in element <%s>' % (self.__class__.__name__, name, name, self.__tag_name__)) - setattr(e, 'missing_attrib', name) - setattr(e, 'tag_name', self.__tag_name__) - raise e - - -def _loads(node): - xo = XmlObject(node.tag) - for key in node.attrib.keys(): - xo.put_attr(key, node.attrib.get(key)) - if node.text: - xo.put_text(node.text) - for n in list(node): - sub_xo = _loads(n) - xo.put_node(n.tag, sub_xo) - return xo - -def loads(xmlstr): - xmlstr = re.sub(r'xmlns=".*"', '', xmlstr) - root = etree.fromstring(xmlstr) - return _loads(root) +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# +# Automatically generated by addcopyright.py at 01/29/2013 +''' +Created on Dec 25, 2012 + +@author: Frank +''' +import xml.etree.ElementTree as etree +import re +import types + +class XmlObject(object): + def __init__(self, tag): + self.__tag_name__ = tag + + def put_attr(self, name, val): + val = val.strip().strip('\t') + setattr(self, name + '_', val) + + def put_text(self, val): + val = val.strip().strip('\n').strip('\t') + if val == "": + setattr(self, 'text_', None) + else: + setattr(self, 'text_', val) + + def put_node(self, name, val): + if not hasattr(self, name): + setattr(self, name, val) + return + + nodes = getattr(self, name) + if not isinstance(nodes, types.ListType): + nodes = [] + old = getattr(self, name) + nodes.append(old) + nodes.append(val) + setattr(self, name, nodes) + else: + nodes.append(val) + setattr(self, name, nodes) + + def get(self, name, default=None): + if hasattr(self, name): + val = getattr(self, name) + if name.endswith('_'): + return val + else: + return val.text_ + else: + return default + + def __getattr__(self, name): + if name.endswith('__'): + n = name[:-1] + if hasattr(self, n): + return getattr(self, n) + else: + return None + else: + e = AttributeError('%s has no attribute %s. missing attribute %s in element <%s>' % (self.__class__.__name__, name, name, self.__tag_name__)) + setattr(e, 'missing_attrib', name) + setattr(e, 'tag_name', self.__tag_name__) + raise e + + +def _loads(node): + xo = XmlObject(node.tag) + for key in node.attrib.keys(): + xo.put_attr(key, node.attrib.get(key)) + if node.text: + xo.put_text(node.text) + for n in list(node): + sub_xo = _loads(n) + xo.put_node(n.tag, sub_xo) + return xo + +def loads(xmlstr): + xmlstr = re.sub(r'xmlns=".*"', '', xmlstr) + root = etree.fromstring(xmlstr) + return _loads(root) diff --git a/test/integration/component/test_host.py b/test/integration/component/test_host.py index c0969d7944e..3f2e9fb5ab3 100644 --- a/test/integration/component/test_host.py +++ b/test/integration/component/test_host.py @@ -1,200 +1,200 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -""" BVT tests for Hosts Test -""" - -# Import Local Modules -from marvin.codes import FAILED -from marvin.cloudstackTestCase import * -from marvin.cloudstackAPI import * -from marvin.lib.utils import * -from marvin.lib.base import * -from marvin.lib.common import * -from nose.plugins.attrib import attr -from marvin.sshClient import SshClient -import time -from time import sleep - -_multiprocess_shared_ = False - - -class TestHostHA(cloudstackTestCase): - - def setUp(self): - self.logger = logging.getLogger('TestHM') - self.stream_handler = logging.StreamHandler() - self.logger.setLevel(logging.DEBUG) - self.logger.addHandler(self.stream_handler) - self.apiclient = self.testClient.getApiClient() - self.hypervisor = self.testClient.getHypervisorInfo() - self.mgtSvrDetails = self.config.__dict__["mgtSvr"][0].__dict__ - self.dbclient = self.testClient.getDbConnection() - self.services = self.testClient.getParsedTestDataConfig() - self.zone = get_zone(self.apiclient, self.testClient.getZoneForTests()) - self.pod = get_pod(self.apiclient, self.zone.id) - self.cleanup = [] - self.services = { - "service_offering": { - "name": "Ultra Tiny Instance", - "displaytext": "Ultra Tiny Instance", - "cpunumber": 1, - "cpuspeed": 100, - "memory": 128, - }, - "service_offering_local": { - "name": "Ultra Tiny Local Instance", - "displaytext": "Ultra Tiny Local Instance", - "cpunumber": 1, - "cpuspeed": 100, - "memory": 128, - "storagetype": "local" - }, - "vm": { - "username": "root", - "password": "password", - "ssh_port": 22, - # Hypervisor type should be same as - # hypervisor type of cluster - "privateport": 22, - "publicport": 22, - "protocol": 'TCP', - }, - "natrule": { - "privateport": 22, - "publicport": 22, - "startport": 22, - "endport": 22, - "protocol": "TCP", - "cidrlist": '0.0.0.0/0', - }, - "ostype": 'CentOS 5.3 (64-bit)', - "sleep": 60, - "timeout": 10, - } - - - def tearDown(self): - try: - # Clean up, terminate the created templates - cleanup_resources(self.apiclient, self.cleanup) - - except Exception as e: - raise Exception("Warning: Exception during cleanup : %s" % e) - - return - - def checkHostDown(self, fromHostIp, testHostIp): - try: - ssh = SshClient(fromHostIp, 22, "root", "password") - res = ssh.execute("ping -c 1 %s" % testHostIp) - result = str(res) - if result.count("100% packet loss") == 1: - return True, 1 - else: - return False, 1 - except Exception as e: - self.logger.debug("Got exception %s" % e) - return False, 1 - - def checkHostUp(self, fromHostIp, testHostIp): - try: - ssh = SshClient(fromHostIp, 22, "root", "password") - res = ssh.execute("ping -c 1 %s" % testHostIp) - result = str(res) - if result.count(" 0% packet loss") == 1: - return True, 1 - else: - return False, 1 - except Exception as e: - self.logger.debug("Got exception %s" % e) - return False, 1 - - def checkHostStateInCloudstack(self, state, hostId): - try: - listHost = Host.list( - self.apiclient, - type='Routing', - zoneid=self.zone.id, - podid=self.pod.id, - id=hostId - ) - self.assertEqual( - isinstance(listHost, list), - True, - "Check if listHost returns a valid response" - ) - - self.assertEqual( - len(listHost), - 1, - "Check if listHost returns a host" - ) - self.logger.debug(" Host state is %s " % listHost[0].state) - if listHost[0].state == state: - return True, 1 - else: - return False, 1 - except Exception as e: - self.logger.debug("Got exception %s" % e) - return False, 1 - - def updateConfigurAndRestart(self, name, value): - Configurations.update(self.apiclient, name, value) - self.RestartServers() - time.sleep(self.services["sleep"]) - - def RestartServers(self): - """ Restart management - server and usage server """ - sshClient = SshClient(self.mgtSvrDetails["mgtSvrIp"], - 22, - self.mgtSvrDetails["user"], - self.mgtSvrDetails["passwd"] - ) - command = "service cloudstack-management restart" - sshClient.execute(command) - return - - @attr( - tags=[ - "advanced", - "advancedns", - "smoke", - "basic", - "eip", - "sg"], - required_hardware="true") - def test_01_host_ha_with_nfs_storagepool_with_vm(self): - Configurations.update(self.apiclient, "ping.timeout", "150") - self.updateConfigurAndRestart("ping.interval", "150") - - listHost = Host.list( - self.apiclient, - type='Routing', - zoneid=self.zone.id, - podid=self.pod.id, - ) - for host in listHost: - self.logger.debug('Hypervisor = {}'.format(host.id)) - - - hostToTest = listHost[0] - hostUpInCloudstack = wait_until(40, 10, self.checkHostStateInCloudstack, "Up", hostToTest.id) - - if not(hostUpInCloudstack): - raise self.fail("Host is not up %s, in cloudstack so failing test " % (hostToTest.ipaddress)) - return +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +""" BVT tests for Hosts Test +""" + +# Import Local Modules +from marvin.codes import FAILED +from marvin.cloudstackTestCase import * +from marvin.cloudstackAPI import * +from marvin.lib.utils import * +from marvin.lib.base import * +from marvin.lib.common import * +from nose.plugins.attrib import attr +from marvin.sshClient import SshClient +import time +from time import sleep + +_multiprocess_shared_ = False + + +class TestHostHA(cloudstackTestCase): + + def setUp(self): + self.logger = logging.getLogger('TestHM') + self.stream_handler = logging.StreamHandler() + self.logger.setLevel(logging.DEBUG) + self.logger.addHandler(self.stream_handler) + self.apiclient = self.testClient.getApiClient() + self.hypervisor = self.testClient.getHypervisorInfo() + self.mgtSvrDetails = self.config.__dict__["mgtSvr"][0].__dict__ + self.dbclient = self.testClient.getDbConnection() + self.services = self.testClient.getParsedTestDataConfig() + self.zone = get_zone(self.apiclient, self.testClient.getZoneForTests()) + self.pod = get_pod(self.apiclient, self.zone.id) + self.cleanup = [] + self.services = { + "service_offering": { + "name": "Ultra Tiny Instance", + "displaytext": "Ultra Tiny Instance", + "cpunumber": 1, + "cpuspeed": 100, + "memory": 128, + }, + "service_offering_local": { + "name": "Ultra Tiny Local Instance", + "displaytext": "Ultra Tiny Local Instance", + "cpunumber": 1, + "cpuspeed": 100, + "memory": 128, + "storagetype": "local" + }, + "vm": { + "username": "root", + "password": "password", + "ssh_port": 22, + # Hypervisor type should be same as + # hypervisor type of cluster + "privateport": 22, + "publicport": 22, + "protocol": 'TCP', + }, + "natrule": { + "privateport": 22, + "publicport": 22, + "startport": 22, + "endport": 22, + "protocol": "TCP", + "cidrlist": '0.0.0.0/0', + }, + "ostype": 'CentOS 5.3 (64-bit)', + "sleep": 60, + "timeout": 10, + } + + + def tearDown(self): + try: + # Clean up, terminate the created templates + cleanup_resources(self.apiclient, self.cleanup) + + except Exception as e: + raise Exception("Warning: Exception during cleanup : %s" % e) + + return + + def checkHostDown(self, fromHostIp, testHostIp): + try: + ssh = SshClient(fromHostIp, 22, "root", "password") + res = ssh.execute("ping -c 1 %s" % testHostIp) + result = str(res) + if result.count("100% packet loss") == 1: + return True, 1 + else: + return False, 1 + except Exception as e: + self.logger.debug("Got exception %s" % e) + return False, 1 + + def checkHostUp(self, fromHostIp, testHostIp): + try: + ssh = SshClient(fromHostIp, 22, "root", "password") + res = ssh.execute("ping -c 1 %s" % testHostIp) + result = str(res) + if result.count(" 0% packet loss") == 1: + return True, 1 + else: + return False, 1 + except Exception as e: + self.logger.debug("Got exception %s" % e) + return False, 1 + + def checkHostStateInCloudstack(self, state, hostId): + try: + listHost = Host.list( + self.apiclient, + type='Routing', + zoneid=self.zone.id, + podid=self.pod.id, + id=hostId + ) + self.assertEqual( + isinstance(listHost, list), + True, + "Check if listHost returns a valid response" + ) + + self.assertEqual( + len(listHost), + 1, + "Check if listHost returns a host" + ) + self.logger.debug(" Host state is %s " % listHost[0].state) + if listHost[0].state == state: + return True, 1 + else: + return False, 1 + except Exception as e: + self.logger.debug("Got exception %s" % e) + return False, 1 + + def updateConfigurAndRestart(self, name, value): + Configurations.update(self.apiclient, name, value) + self.RestartServers() + time.sleep(self.services["sleep"]) + + def RestartServers(self): + """ Restart management + server and usage server """ + sshClient = SshClient(self.mgtSvrDetails["mgtSvrIp"], + 22, + self.mgtSvrDetails["user"], + self.mgtSvrDetails["passwd"] + ) + command = "service cloudstack-management restart" + sshClient.execute(command) + return + + @attr( + tags=[ + "advanced", + "advancedns", + "smoke", + "basic", + "eip", + "sg"], + required_hardware="true") + def test_01_host_ha_with_nfs_storagepool_with_vm(self): + Configurations.update(self.apiclient, "ping.timeout", "150") + self.updateConfigurAndRestart("ping.interval", "150") + + listHost = Host.list( + self.apiclient, + type='Routing', + zoneid=self.zone.id, + podid=self.pod.id, + ) + for host in listHost: + self.logger.debug('Hypervisor = {}'.format(host.id)) + + + hostToTest = listHost[0] + hostUpInCloudstack = wait_until(40, 10, self.checkHostStateInCloudstack, "Up", hostToTest.id) + + if not(hostUpInCloudstack): + raise self.fail("Host is not up %s, in cloudstack so failing test " % (hostToTest.ipaddress)) + return diff --git a/test/integration/component/test_multi_tag_support.py b/test/integration/component/test_multi_tag_support.py index 313fffbd6d2..399a96fb462 100755 --- a/test/integration/component/test_multi_tag_support.py +++ b/test/integration/component/test_multi_tag_support.py @@ -1,217 +1,217 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -from marvin.cloudstackTestCase import cloudstackTestCase -from marvin.lib.base import * -from marvin.lib.common import get_zone, get_domain, get_template -from marvin.lib.utils import cleanup_resources - - -class Services: - """Test multi tag support in compute offerings - """ - - def __init__(self): - self.services = { - "account": { - "email": "john@doe.de", - "firstname": "Test", - "lastname": "User", - "username": "test", - # Random characters are appended for unique - # username - "password": "password", - }, - "service_offering_0": { - "name": "NoTag", - "displaytext": "NoTag", - "cpunumber": 1, - "cpuspeed": 100, - # in MHz - "memory": 128, - # In MBs - }, - "service_offering_1": { - "name": "OneTag", - "displaytext": "OneTag", - "cpunumber": 1, - "cpuspeed": 100, - "hosttags": "tag1", - # in MHz - "memory": 128, - # In MBs - }, - "service_offering_2": { - "name": "TwoTag", - "displaytext": "TwoTag", - "cpunumber": 1, - "cpuspeed": 100, - "hosttags": "tag2,tag1", - # in MHz - "memory": 128, - # In MBs - }, - "service_offering_not_existing_tag": { - "name": "NotExistingTag", - "displaytext": "NotExistingTag", - "cpunumber": 1, - "cpuspeed": 100, - "hosttags": "tagX", - # in MHz - "memory": 128, - # In MBs - }, - "virtual_machine": { - "name": "TestVM", - "displayname": "TestVM" - }, - "template": { - "displaytext": "Ubuntu", - "name": "Ubuntu16 x64", - "ostype": 'Ubuntu 16.04 (64-bit)', - "templatefilter": 'self', - }, - "network": { - "name": "Guest", - }, - "host": { - "name": "" - } - } - - -class TestMultiTagSupport(cloudstackTestCase): - - @classmethod - def setUpClass(cls): - cls.testClient = super(TestMultiTagSupport, cls).getClsTestClient() - cls.hypervisor = cls.testClient.getHypervisorInfo() - cls.api_client = cls.testClient.getApiClient() - cls.services = Services().services - cls.zone = get_zone(cls.api_client) - cls.domain = get_domain(cls.api_client) - cls.network = cls.get_network() - cls.host = cls.get_host() - cls.host_tags = cls.host["hosttags"] - - cls.template = get_template( - cls.api_client, - cls.zone.id, - cls.services["template"]["ostype"] - ) - - cls.service_offering_list = [] - for x in range(0, 3): - cls.service_offering_list.append(ServiceOffering.create( - cls.api_client, - cls.services["service_offering_" + str(x)] - )) - - cls.service_offering_ne_tag = ServiceOffering.create( - cls.api_client, - cls.services["service_offering_not_existing_tag"] - ) - - cls.account = Account.create( - cls.api_client, - cls.services["account"], - admin=True, - ) - - cls._cleanup = [ - cls.account, - cls.service_offering_ne_tag, - ] + cls.service_offering_list - - @classmethod - def tearDownClass(cls): - try: - # Cleanup resources used - print("Cleanup resources used") - Host.update(cls.api_client, id=cls.host["id"], hosttags=cls.host_tags) - cleanup_resources(cls.api_client, cls._cleanup) - except Exception as e: - raise Exception("Warning: Exception during cleanup : %s" % e) - return - - def test_multi_tags(self): - for x in range(0, len(self.service_offering_list)): - - if hasattr(self.service_offering_list[x], 'hosttags'): - Host.update(self.api_client, id=self.host["id"], hosttags=self.service_offering_list[x].hosttags) - - vm = VirtualMachine.create( - self.api_client, - self.services["virtual_machine"], - accountid=self.account.name, - domainid=self.account.domainid, - zoneid=self.zone.id, - serviceofferingid=self.service_offering_list[x].id, - templateid=self.template.id, - networkids=self.network.id - ) - - self.assertEqual( - isinstance(vm, VirtualMachine), - True, - "VM %s should be created with service offering %s " % - (self.services["virtual_machine"]["name"], self.service_offering_list[x].name)) - - vm.delete(self.api_client, True) - - def test_no_existing_tag(self): - - with self.assertRaises(Exception): - VirtualMachine.create( - self.api_client, - self.services["virtual_machine"], - accountid=self.account.name, - domainid=self.account.domainid, - zoneid=self.zone.id, - serviceofferingid=self.service_offering_ne_tag.id, - templateid=self.template.id, - networkids=self.network.id - ) - return - - @classmethod - def get_network(cls): - networks = Network.list(cls.api_client, zoneid=cls.zone.id) - if len(networks) == 1: - return networks[0] - - if len(networks) > 1: - for network in networks: - if network.name == cls.services["network"]["name"]: - return network - raise ValueError("No suitable network found, check network name in service object") - - raise ValueError("No network found for zone with id %s" % cls.zone.id) - - @classmethod - def get_host(cls): - hosts = Host.list(cls.api_client, zoneid=cls.zone.id) - - if len(hosts) == 1: - return hosts[0] - - if len(hosts) > 1: - for host in hosts: - if host.name == cls.services["host"]["name"]: - return host - raise ValueError("No suitable host found, check host name in service object") - - raise ValueError("No host found for zone with id %s" % cls.zone.id) +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from marvin.cloudstackTestCase import cloudstackTestCase +from marvin.lib.base import * +from marvin.lib.common import get_zone, get_domain, get_template +from marvin.lib.utils import cleanup_resources + + +class Services: + """Test multi tag support in compute offerings + """ + + def __init__(self): + self.services = { + "account": { + "email": "john@doe.de", + "firstname": "Test", + "lastname": "User", + "username": "test", + # Random characters are appended for unique + # username + "password": "password", + }, + "service_offering_0": { + "name": "NoTag", + "displaytext": "NoTag", + "cpunumber": 1, + "cpuspeed": 100, + # in MHz + "memory": 128, + # In MBs + }, + "service_offering_1": { + "name": "OneTag", + "displaytext": "OneTag", + "cpunumber": 1, + "cpuspeed": 100, + "hosttags": "tag1", + # in MHz + "memory": 128, + # In MBs + }, + "service_offering_2": { + "name": "TwoTag", + "displaytext": "TwoTag", + "cpunumber": 1, + "cpuspeed": 100, + "hosttags": "tag2,tag1", + # in MHz + "memory": 128, + # In MBs + }, + "service_offering_not_existing_tag": { + "name": "NotExistingTag", + "displaytext": "NotExistingTag", + "cpunumber": 1, + "cpuspeed": 100, + "hosttags": "tagX", + # in MHz + "memory": 128, + # In MBs + }, + "virtual_machine": { + "name": "TestVM", + "displayname": "TestVM" + }, + "template": { + "displaytext": "Ubuntu", + "name": "Ubuntu16 x64", + "ostype": 'Ubuntu 16.04 (64-bit)', + "templatefilter": 'self', + }, + "network": { + "name": "Guest", + }, + "host": { + "name": "" + } + } + + +class TestMultiTagSupport(cloudstackTestCase): + + @classmethod + def setUpClass(cls): + cls.testClient = super(TestMultiTagSupport, cls).getClsTestClient() + cls.hypervisor = cls.testClient.getHypervisorInfo() + cls.api_client = cls.testClient.getApiClient() + cls.services = Services().services + cls.zone = get_zone(cls.api_client) + cls.domain = get_domain(cls.api_client) + cls.network = cls.get_network() + cls.host = cls.get_host() + cls.host_tags = cls.host["hosttags"] + + cls.template = get_template( + cls.api_client, + cls.zone.id, + cls.services["template"]["ostype"] + ) + + cls.service_offering_list = [] + for x in range(0, 3): + cls.service_offering_list.append(ServiceOffering.create( + cls.api_client, + cls.services["service_offering_" + str(x)] + )) + + cls.service_offering_ne_tag = ServiceOffering.create( + cls.api_client, + cls.services["service_offering_not_existing_tag"] + ) + + cls.account = Account.create( + cls.api_client, + cls.services["account"], + admin=True, + ) + + cls._cleanup = [ + cls.account, + cls.service_offering_ne_tag, + ] + cls.service_offering_list + + @classmethod + def tearDownClass(cls): + try: + # Cleanup resources used + print("Cleanup resources used") + Host.update(cls.api_client, id=cls.host["id"], hosttags=cls.host_tags) + cleanup_resources(cls.api_client, cls._cleanup) + except Exception as e: + raise Exception("Warning: Exception during cleanup : %s" % e) + return + + def test_multi_tags(self): + for x in range(0, len(self.service_offering_list)): + + if hasattr(self.service_offering_list[x], 'hosttags'): + Host.update(self.api_client, id=self.host["id"], hosttags=self.service_offering_list[x].hosttags) + + vm = VirtualMachine.create( + self.api_client, + self.services["virtual_machine"], + accountid=self.account.name, + domainid=self.account.domainid, + zoneid=self.zone.id, + serviceofferingid=self.service_offering_list[x].id, + templateid=self.template.id, + networkids=self.network.id + ) + + self.assertEqual( + isinstance(vm, VirtualMachine), + True, + "VM %s should be created with service offering %s " % + (self.services["virtual_machine"]["name"], self.service_offering_list[x].name)) + + vm.delete(self.api_client, True) + + def test_no_existing_tag(self): + + with self.assertRaises(Exception): + VirtualMachine.create( + self.api_client, + self.services["virtual_machine"], + accountid=self.account.name, + domainid=self.account.domainid, + zoneid=self.zone.id, + serviceofferingid=self.service_offering_ne_tag.id, + templateid=self.template.id, + networkids=self.network.id + ) + return + + @classmethod + def get_network(cls): + networks = Network.list(cls.api_client, zoneid=cls.zone.id) + if len(networks) == 1: + return networks[0] + + if len(networks) > 1: + for network in networks: + if network.name == cls.services["network"]["name"]: + return network + raise ValueError("No suitable network found, check network name in service object") + + raise ValueError("No network found for zone with id %s" % cls.zone.id) + + @classmethod + def get_host(cls): + hosts = Host.list(cls.api_client, zoneid=cls.zone.id) + + if len(hosts) == 1: + return hosts[0] + + if len(hosts) > 1: + for host in hosts: + if host.name == cls.services["host"]["name"]: + return host + raise ValueError("No suitable host found, check host name in service object") + + raise ValueError("No host found for zone with id %s" % cls.zone.id) diff --git a/test/integration/component/test_ncc_integration_dedicated.py b/test/integration/component/test_ncc_integration_dedicated.py index b02d0513779..73e2450cfef 100644 --- a/test/integration/component/test_ncc_integration_dedicated.py +++ b/test/integration/component/test_ncc_integration_dedicated.py @@ -1,269 +1,269 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -""" -BVT tests for NCC integration with cloudstack -""" -#Import Local Modules -from marvin.cloudstackTestCase import cloudstackTestCase -from marvin.lib.common import get_domain, get_zone, get_template -from marvin.lib import ncc -from marvin.lib.base import (Account, - VirtualMachine, - PublicIPAddress, - LoadBalancerRule, - ServiceOffering, - NetworkOffering, - Network, - NATRule, - PhysicalNetwork, - NetworkServiceProvider, - RegisteredServicePackage) -from marvin.lib.utils import cleanup_resources -from nose.plugins.attrib import attr -import logging - - -class TestNccIntegrationDedicated(cloudstackTestCase): - - @classmethod - def setUpClass(cls): - cls.testClient = super(TestNccIntegrationDedicated, cls).getClsTestClient() - cls.api_client = cls.testClient.getApiClient() - cls.services = cls.testClient.getParsedTestDataConfig() - cls._cleanup = [] - - cls.logger = logging.getLogger('TestNccIntegrationDedicated') - cls.stream_handler = logging.StreamHandler() - cls.logger.setLevel(logging.DEBUG) - cls.logger.addHandler(cls.stream_handler) - - # Get Zone, Domain and templates - cls.domain = get_domain(cls.api_client) - cls.zone = get_zone(cls.api_client, cls.testClient.getZoneForTests()) - cls.services['mode'] = cls.zone.networktype - cls.template = get_template( - cls.api_client, - cls.zone.id, - cls.services["ostype"] ) - ncc_ip = cls.services["NCC"]["NCCIP"] - ns_ip = cls.services["NSDedicated"]["NSIP"] - cls.debug("NS IP - Dedicated: %s" % ns_ip) - - mgmt_srv_ip = cls.config.__dict__["mgtSvr"][0].__dict__["mgtSvrIp"] - #ncc_ip = "10.102.195.215" - #ns_ip = "10.102.195.210" - cls.ns = ncc.NCC(ncc_ip, ns_ip, mgmt_srv_ip, logger=cls.logger) - cls.ns.registerCCP(cls.api_client) - cls.ns.registerNS() - cls.ns.assignNStoCSZone() - spname = cls.services["servicepackage_dedicated"]["name"] - - # Create Service package and get device group id, tenant group id and service package id - # These would be needed later for clean up - - (cls.dv_group_id, cls.tnt_group_id, cls.srv_pkg_id) = cls.ns.createServicePackages( - spname, - "NetScalerVPX", - ns_ip, - isolation_policy="dedicated") - cls.debug("Created service package in NCC") - cls.debug("dv_group, tnt_group, srv_pkg_id: %s %s %s" %(cls.dv_group_id,cls.tnt_group_id, cls.srv_pkg_id)) - - srv_pkg_list = RegisteredServicePackage.list(cls.api_client) - # Choose the one created - cls.srv_pkg_uuid = None - for sp in srv_pkg_list: - if sp.name == spname: - cls.srv_pkg_uuid = sp.id - #srv_pkg_id = srv_pkg_list[0].id - - cls.account = Account.create( - cls.api_client, - cls.services["account"] - ) - cls._cleanup.append(cls.account) - - try: - cls.services["nw_off_ncc_DedicatedSP"]["servicepackageuuid"] = cls.srv_pkg_uuid - cls.services["nw_off_ncc_DedicatedSP"]["servicepackagedescription"] = "A NetScalerVPX is dedicated per network." - cls.network_offering = NetworkOffering.create( - cls.api_client, - cls.services["nw_off_ncc_DedicatedSP"]) - except Exception as e: - raise Exception ("Unable to create network offering with Service package % s due to exception % s" - % (cls.srv_pkg_uuid, e)) - - # Network offering should be removed so that service package may be deleted later - cls._cleanup.append(cls.network_offering) - - cls.network_offering.update(cls.api_client, state = "Enabled") - cls.service_offering = ServiceOffering.create( - cls.api_client, - cls.services["service_offering"] - ) - cls.services["small"]["template"] = cls.template.id - - # Enable Netscaler Service Provider - - cls.phy_nws = PhysicalNetwork.list(cls.api_client,zoneid=cls.zone.id) - if isinstance(cls.phy_nws, list): - physical_network = cls.phy_nws[0] - - try: - cls.ns_service_provider = NetworkServiceProvider.list(cls.api_client,name='Netscaler') - if isinstance(cls.ns_service_provider, list): - ns_provider = cls.ns_service_provider[0] - except: - raise Exception ("Netscaler service provider not found!!") - - try: - if ns_provider.state != "Enabled": - NetworkServiceProvider.update(cls.api_client, id=ns_provider.id, physicalnetworkid=physical_network.id, state="Enabled") - except: - raise Exception ("Enabling Netscaler Service provider failed. Unable to proceed") - - return - - @classmethod - def tearDownClass(cls): - try: - # Cleanup resources used - cleanup_resources(cls.api_client, cls._cleanup) - except Exception as e: - raise Exception("Warning: Exception during cleanup : %s" % e) - cls.ns.cleanup_ncc(cls.dv_group_id, cls.srv_pkg_uuid, cls.srv_pkg_id, cls.tnt_group_id) - return - - def setUp(self): - self.apiclient = self.testClient.getApiClient() - return - - def tearDown(self): - return - - - @attr(tags=["ncc"], required_hardware="true") - def test_01_dedicated_first_network(self): - # Create network - self.debug("Creating network with network offering: %s" % self.network_offering.id) - self.network = Network.create( - self.apiclient, - self.services["network"], - accountid=self.account.name, - domainid=self.account.domainid, - networkofferingid=self.network_offering.id, - zoneid=self.zone.id - ) - self.debug("Created network: %s" % self.network.id) - - self.debug("Trying VM deploy with network created on account: %s" % self.account.name) - - self.virtual_machine = VirtualMachine.create( - self.apiclient, - self.services["small"], - accountid=self.account.name, - domainid=self.account.domainid, - zoneid=self.zone.id, - networkids=self.network.id, - serviceofferingid=self.service_offering.id - ) - self.debug("Deployed VM in network: %s" % self.network.id) - list_vm_response = VirtualMachine.list( - self.apiclient, - id=self.virtual_machine.id - ) - self.debug( - "Verify listVirtualMachines response for virtual machine: %s" - % self.virtual_machine.id - ) - - self.assertEqual( - isinstance(list_vm_response, list), - True, - "Check list response returns a valid list") - vm_response = list_vm_response[0] - - self.assertEqual( - vm_response.state, - "Running", - "VM state should be running after deployment" - ) - - self.debug("Aquiring public IP for network: %s" % self.network.id) - - ip_with_lb_rule = PublicIPAddress.create( - self.apiclient, - accountid=self.account.name, - zoneid=self.zone.id, - domainid=self.account.domainid, - networkid=self.network.id) - - self.debug( - "Creating LB rule for IP address: %s with round robin algo" % - ip_with_lb_rule.ipaddress.ipaddress) - - self.services["lbrule"]["alg"] = 'roundrobin' - lb_rule = LoadBalancerRule.create( - self.apiclient, - self.services["lbrule"], - ipaddressid=ip_with_lb_rule.ipaddress.id, - accountid=self.account.name, - networkid=self.network.id - ) - - lb_rules = LoadBalancerRule.list( - self.apiclient, - id=lb_rule.id, - listall=True - ) - self.assertEqual( - isinstance(lb_rules, list), - True, - "List LB rules should return a newly created LB rule" - ) - self.debug("Adding %s to the LB rule %s" % ( - self.virtual_machine.name, - lb_rule.name - )) - lb_rule.assign(self.apiclient, [self.virtual_machine]) - - @attr(tags=["ncc"], required_hardware="true") - def test_02_dedicated_another_network(self): - # Create network - self.network = Network.create( - self.apiclient, - self.services["network"], - accountid=self.account.name, - domainid=self.account.domainid, - networkofferingid=self.network_offering.id, - zoneid=self.zone.id - ) - self.debug("Created network: %s" % self.network.id) - - self.debug("Trying VM deploy with network created on account: %s" % self.account.name) - - with self.assertRaises(Exception): - self.virtual_machine = VirtualMachine.create( - self.apiclient, - self.services["small"], - accountid=self.account.name, - domainid=self.account.domainid, - networkids=self.network.id, - zoneid=self.zone.id, - serviceofferingid=self.service_offering.id - ) - return +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +""" +BVT tests for NCC integration with cloudstack +""" +#Import Local Modules +from marvin.cloudstackTestCase import cloudstackTestCase +from marvin.lib.common import get_domain, get_zone, get_template +from marvin.lib import ncc +from marvin.lib.base import (Account, + VirtualMachine, + PublicIPAddress, + LoadBalancerRule, + ServiceOffering, + NetworkOffering, + Network, + NATRule, + PhysicalNetwork, + NetworkServiceProvider, + RegisteredServicePackage) +from marvin.lib.utils import cleanup_resources +from nose.plugins.attrib import attr +import logging + + +class TestNccIntegrationDedicated(cloudstackTestCase): + + @classmethod + def setUpClass(cls): + cls.testClient = super(TestNccIntegrationDedicated, cls).getClsTestClient() + cls.api_client = cls.testClient.getApiClient() + cls.services = cls.testClient.getParsedTestDataConfig() + cls._cleanup = [] + + cls.logger = logging.getLogger('TestNccIntegrationDedicated') + cls.stream_handler = logging.StreamHandler() + cls.logger.setLevel(logging.DEBUG) + cls.logger.addHandler(cls.stream_handler) + + # Get Zone, Domain and templates + cls.domain = get_domain(cls.api_client) + cls.zone = get_zone(cls.api_client, cls.testClient.getZoneForTests()) + cls.services['mode'] = cls.zone.networktype + cls.template = get_template( + cls.api_client, + cls.zone.id, + cls.services["ostype"] ) + ncc_ip = cls.services["NCC"]["NCCIP"] + ns_ip = cls.services["NSDedicated"]["NSIP"] + cls.debug("NS IP - Dedicated: %s" % ns_ip) + + mgmt_srv_ip = cls.config.__dict__["mgtSvr"][0].__dict__["mgtSvrIp"] + #ncc_ip = "10.102.195.215" + #ns_ip = "10.102.195.210" + cls.ns = ncc.NCC(ncc_ip, ns_ip, mgmt_srv_ip, logger=cls.logger) + cls.ns.registerCCP(cls.api_client) + cls.ns.registerNS() + cls.ns.assignNStoCSZone() + spname = cls.services["servicepackage_dedicated"]["name"] + + # Create Service package and get device group id, tenant group id and service package id + # These would be needed later for clean up + + (cls.dv_group_id, cls.tnt_group_id, cls.srv_pkg_id) = cls.ns.createServicePackages( + spname, + "NetScalerVPX", + ns_ip, + isolation_policy="dedicated") + cls.debug("Created service package in NCC") + cls.debug("dv_group, tnt_group, srv_pkg_id: %s %s %s" %(cls.dv_group_id,cls.tnt_group_id, cls.srv_pkg_id)) + + srv_pkg_list = RegisteredServicePackage.list(cls.api_client) + # Choose the one created + cls.srv_pkg_uuid = None + for sp in srv_pkg_list: + if sp.name == spname: + cls.srv_pkg_uuid = sp.id + #srv_pkg_id = srv_pkg_list[0].id + + cls.account = Account.create( + cls.api_client, + cls.services["account"] + ) + cls._cleanup.append(cls.account) + + try: + cls.services["nw_off_ncc_DedicatedSP"]["servicepackageuuid"] = cls.srv_pkg_uuid + cls.services["nw_off_ncc_DedicatedSP"]["servicepackagedescription"] = "A NetScalerVPX is dedicated per network." + cls.network_offering = NetworkOffering.create( + cls.api_client, + cls.services["nw_off_ncc_DedicatedSP"]) + except Exception as e: + raise Exception ("Unable to create network offering with Service package % s due to exception % s" + % (cls.srv_pkg_uuid, e)) + + # Network offering should be removed so that service package may be deleted later + cls._cleanup.append(cls.network_offering) + + cls.network_offering.update(cls.api_client, state = "Enabled") + cls.service_offering = ServiceOffering.create( + cls.api_client, + cls.services["service_offering"] + ) + cls.services["small"]["template"] = cls.template.id + + # Enable Netscaler Service Provider + + cls.phy_nws = PhysicalNetwork.list(cls.api_client,zoneid=cls.zone.id) + if isinstance(cls.phy_nws, list): + physical_network = cls.phy_nws[0] + + try: + cls.ns_service_provider = NetworkServiceProvider.list(cls.api_client,name='Netscaler') + if isinstance(cls.ns_service_provider, list): + ns_provider = cls.ns_service_provider[0] + except: + raise Exception ("Netscaler service provider not found!!") + + try: + if ns_provider.state != "Enabled": + NetworkServiceProvider.update(cls.api_client, id=ns_provider.id, physicalnetworkid=physical_network.id, state="Enabled") + except: + raise Exception ("Enabling Netscaler Service provider failed. Unable to proceed") + + return + + @classmethod + def tearDownClass(cls): + try: + # Cleanup resources used + cleanup_resources(cls.api_client, cls._cleanup) + except Exception as e: + raise Exception("Warning: Exception during cleanup : %s" % e) + cls.ns.cleanup_ncc(cls.dv_group_id, cls.srv_pkg_uuid, cls.srv_pkg_id, cls.tnt_group_id) + return + + def setUp(self): + self.apiclient = self.testClient.getApiClient() + return + + def tearDown(self): + return + + + @attr(tags=["ncc"], required_hardware="true") + def test_01_dedicated_first_network(self): + # Create network + self.debug("Creating network with network offering: %s" % self.network_offering.id) + self.network = Network.create( + self.apiclient, + self.services["network"], + accountid=self.account.name, + domainid=self.account.domainid, + networkofferingid=self.network_offering.id, + zoneid=self.zone.id + ) + self.debug("Created network: %s" % self.network.id) + + self.debug("Trying VM deploy with network created on account: %s" % self.account.name) + + self.virtual_machine = VirtualMachine.create( + self.apiclient, + self.services["small"], + accountid=self.account.name, + domainid=self.account.domainid, + zoneid=self.zone.id, + networkids=self.network.id, + serviceofferingid=self.service_offering.id + ) + self.debug("Deployed VM in network: %s" % self.network.id) + list_vm_response = VirtualMachine.list( + self.apiclient, + id=self.virtual_machine.id + ) + self.debug( + "Verify listVirtualMachines response for virtual machine: %s" + % self.virtual_machine.id + ) + + self.assertEqual( + isinstance(list_vm_response, list), + True, + "Check list response returns a valid list") + vm_response = list_vm_response[0] + + self.assertEqual( + vm_response.state, + "Running", + "VM state should be running after deployment" + ) + + self.debug("Aquiring public IP for network: %s" % self.network.id) + + ip_with_lb_rule = PublicIPAddress.create( + self.apiclient, + accountid=self.account.name, + zoneid=self.zone.id, + domainid=self.account.domainid, + networkid=self.network.id) + + self.debug( + "Creating LB rule for IP address: %s with round robin algo" % + ip_with_lb_rule.ipaddress.ipaddress) + + self.services["lbrule"]["alg"] = 'roundrobin' + lb_rule = LoadBalancerRule.create( + self.apiclient, + self.services["lbrule"], + ipaddressid=ip_with_lb_rule.ipaddress.id, + accountid=self.account.name, + networkid=self.network.id + ) + + lb_rules = LoadBalancerRule.list( + self.apiclient, + id=lb_rule.id, + listall=True + ) + self.assertEqual( + isinstance(lb_rules, list), + True, + "List LB rules should return a newly created LB rule" + ) + self.debug("Adding %s to the LB rule %s" % ( + self.virtual_machine.name, + lb_rule.name + )) + lb_rule.assign(self.apiclient, [self.virtual_machine]) + + @attr(tags=["ncc"], required_hardware="true") + def test_02_dedicated_another_network(self): + # Create network + self.network = Network.create( + self.apiclient, + self.services["network"], + accountid=self.account.name, + domainid=self.account.domainid, + networkofferingid=self.network_offering.id, + zoneid=self.zone.id + ) + self.debug("Created network: %s" % self.network.id) + + self.debug("Trying VM deploy with network created on account: %s" % self.account.name) + + with self.assertRaises(Exception): + self.virtual_machine = VirtualMachine.create( + self.apiclient, + self.services["small"], + accountid=self.account.name, + domainid=self.account.domainid, + networkids=self.network.id, + zoneid=self.zone.id, + serviceofferingid=self.service_offering.id + ) + return diff --git a/test/integration/component/test_ncc_integration_shared.py b/test/integration/component/test_ncc_integration_shared.py index cb5b90ce900..c91c41f0359 100644 --- a/test/integration/component/test_ncc_integration_shared.py +++ b/test/integration/component/test_ncc_integration_shared.py @@ -1,323 +1,323 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -""" -BVT tests for NCC integration with cloudstack -""" -#Import Local Modules -from marvin.cloudstackTestCase import cloudstackTestCase -from marvin.lib.common import get_domain, get_zone, get_template -from marvin.lib import ncc -from marvin.lib.base import (Account, - VirtualMachine, - PublicIPAddress, - LoadBalancerRule, - ServiceOffering, - NetworkOffering, - Network, - NATRule, - PhysicalNetwork, - NetworkServiceProvider, - RegisteredServicePackage) -from marvin.lib.utils import cleanup_resources -from nose.plugins.attrib import attr -import logging - - -class TestNccIntegrationShared(cloudstackTestCase): - - @classmethod - def setUpClass(cls): - cls.testClient = super(TestNccIntegrationShared, cls).getClsTestClient() - cls.api_client = cls.testClient.getApiClient() - cls.services = cls.testClient.getParsedTestDataConfig() - cls._cleanup = [] - - cls.logger = logging.getLogger('TestNccIntegrationShared') - cls.stream_handler = logging.StreamHandler() - cls.logger.setLevel(logging.DEBUG) - cls.logger.addHandler(cls.stream_handler) - - # Get Zone, Domain and templates - cls.domain = get_domain(cls.api_client) - cls.zone = get_zone(cls.api_client, cls.testClient.getZoneForTests()) - cls.services['mode'] = cls.zone.networktype - cls.template = get_template( - cls.api_client, - cls.zone.id, - cls.services["ostype"] ) - ncc_ip=cls.services["NCC"]["NCCIP"] - ns_ip=cls.services["NSShared"]["NSIP"] - cls.debug("NS IP: Shared: %s" % ns_ip) - - mgmt_srv_ip = cls.config.__dict__["mgtSvr"][0].__dict__["mgtSvrIp"] - #ncc_ip = "10.102.195.215" - #ns_ip = "10.102.195.210" - cls.ns = ncc.NCC(ncc_ip, ns_ip, mgmt_srv_ip, logger=cls.logger) - cls.ns.registerCCP(cls.api_client) - cls.ns.registerNS() - cls.ns.assignNStoCSZone() - spname = cls.services["servicepackage_shared"]["name"] - cls.debug("SPname (Shared): %s" % spname) - #spname="SharedSP9" - # Create Service package and get device group id, tenant group id and service package id - # These would be needed later for clean up - - (cls.dv_group_id, cls.tnt_group_id, cls.srv_pkg_id) = cls.ns.createServicePackages( - spname, - "NetScalerVPX", - ns_ip) - srv_pkg_list = RegisteredServicePackage.list(cls.api_client) - # Choose the one created - cls.srv_pkg_uuid = None - for sp in srv_pkg_list: - if sp.name == spname: - cls.srv_pkg_uuid = sp.id - #srv_pkg_id = srv_pkg_list[0].id - - cls.account = Account.create( - cls.api_client, - cls.services["account"] - ) - cls._cleanup.append(cls.account) - - try: - cls.services["nw_off_ncc_SharedSP"]["servicepackageuuid"] = cls.srv_pkg_uuid - cls.services["nw_off_ncc_SharedSP"]["servicepackagedescription"] = "A NetScalerVPX is shared across all networks." - cls.network_offering = NetworkOffering.create( - cls.api_client, - cls.services["nw_off_ncc_SharedSP"]) - except Exception as e: - raise Exception ("Unable to create network offering with Service package % s due to exception % s" - % (cls.srv_pkg_uuid, e)) - - # Network offering should be removed so that service package may be deleted later - cls._cleanup.append(cls.network_offering) - - cls.network_offering.update(cls.api_client, state = "Enabled") - cls.service_offering_shared = ServiceOffering.create( - cls.api_client, - cls.services["service_offering"] - ) - cls.services["small"]["template"] = cls.template.id - - # Enable Netscaler Service Provider - - cls.phy_nws = PhysicalNetwork.list(cls.api_client,zoneid=cls.zone.id) - if isinstance(cls.phy_nws, list): - physical_network = cls.phy_nws[0] - - try: - cls.ns_service_provider = NetworkServiceProvider.list(cls.api_client,name='Netscaler') - if isinstance(cls.ns_service_provider, list): - ns_provider = cls.ns_service_provider[0] - except: - raise Exception ("Netscaler service provider not found!!") - - try: - if ns_provider.state != "Enabled": - NetworkServiceProvider.update(cls.api_client, id=ns_provider.id, physicalnetworkid=physical_network.id, state="Enabled") - except: - raise Exception ("Enabling Netscaler Service provider failed. Unable to proceed") - - return - - @classmethod - def tearDownClass(cls): - try: - # Cleanup resources used - cleanup_resources(cls.api_client, cls._cleanup) - except Exception as e: - raise Exception("Warning: Exception during cleanup : %s" % e) - cls.ns.cleanup_ncc(cls.dv_group_id, cls.srv_pkg_uuid, cls.srv_pkg_id, cls.tnt_group_id) - return - - def setUp(self): - self.apiclient = self.testClient.getApiClient() - return - - def tearDown(self): - return - - @attr(tags=["ncc"], required_hardware="true") - def test_01_shared_first_network(self): - # Create network - self.debug("Creating network with network offering: %s" % self.network_offering.id) - self.network = Network.create( - self.apiclient, - self.services["network"], - accountid=self.account.name, - domainid=self.account.domainid, - networkofferingid=self.network_offering.id, - zoneid=self.zone.id - ) - self.debug("Created network: %s" % self.network.id) - - self.debug("Trying VM deploy with network created on account: %s" % self.account.name) - - self.virtual_machine = VirtualMachine.create( - self.apiclient, - self.services["small"], - accountid=self.account.name, - domainid=self.account.domainid, - zoneid=self.zone.id, - networkids=self.network.id, - serviceofferingid=self.service_offering_shared.id) - self.debug("Deployed VM in network: %s" % self.network.id) - list_vm_response = VirtualMachine.list( - self.apiclient, - id=self.virtual_machine.id - ) - self.debug( - "Verify listVirtualMachines response for virtual machine: %s" - % self.virtual_machine.id - ) - - self.assertEqual( - isinstance(list_vm_response, list), - True, - "Check list response returns a valid list") - vm_response = list_vm_response[0] - - self.assertEqual( - vm_response.state, - "Running", - "VM state should be running after deployment" - ) - - self.debug("Acquiring public IP for network: %s" % self.network.id) - - ip_with_lb_rule = PublicIPAddress.create( - self.apiclient, - accountid=self.account.name, - zoneid=self.zone.id, - domainid=self.account.domainid, - networkid=self.network.id) - - self.debug( - "Creating LB rule for IP address: %s with round robin algo" % - ip_with_lb_rule.ipaddress.ipaddress) - - self.services["lbrule"]["alg"] = 'roundrobin' - lb_rule = LoadBalancerRule.create( - self.apiclient, - self.services["lbrule"], - ipaddressid=ip_with_lb_rule.ipaddress.id, - accountid=self.account.name, - networkid=self.network.id - ) - - lb_rules = LoadBalancerRule.list( - self.apiclient, - id=lb_rule.id, - listall=True - ) - self.assertEqual( - isinstance(lb_rules, list), - True, - "List LB rules should return a newly created LB rule" - ) - self.debug("Adding %s to the LB rule %s" % ( - self.virtual_machine.name, - lb_rule.name - )) - lb_rule.assign(self.apiclient, [self.virtual_machine]) - - @attr(tags=["ncc"], required_hardware="true") - def test_02_shared_another_network(self): - # Create network - self.debug("Creating network with network offering: %s" % self.network_offering.id) - self.network = Network.create( - self.apiclient, - self.services["network"], - accountid=self.account.name, - domainid=self.account.domainid, - networkofferingid=self.network_offering.id, - zoneid=self.zone.id - ) - self.debug("Created network: %s" % self.network.id) - - self.debug("Trying VM deploy with network created on account: %s" % self.account.name) - - self.virtual_machine = VirtualMachine.create( - self.apiclient, - self.services["small"], - accountid=self.account.name, - domainid=self.account.domainid, - networkids=self.network.id, - zoneid=self.zone.id, - serviceofferingid=self.service_offering_shared.id - ) - self.debug("Deployed VM in network: %s" % self.network.id) - list_vm_response = VirtualMachine.list( - self.apiclient, - id=self.virtual_machine.id - ) - self.debug( - "Verify listVirtualMachines response for virtual machine: %s" - % self.virtual_machine.id - ) - - self.assertEqual( - isinstance(list_vm_response, list), - True, - "Check list response returns a valid list") - vm_response = list_vm_response[0] - - self.assertEqual( - vm_response.state, - "Running", - "VM state should be running after deployment" - ) - - self.debug("Aquiring public IP for network: %s" % self.network.id) - - ip_with_lb_rule = PublicIPAddress.create( - self.apiclient, - accountid=self.account.name, - zoneid=self.zone.id, - domainid=self.account.domainid, - networkid=self.network.id) - - self.debug( - "Creating LB rule for IP address: %s with round robin algo" % - ip_with_lb_rule.ipaddress.ipaddress) - - self.services["lbrule"]["alg"] = 'roundrobin' - lb_rule = LoadBalancerRule.create( - self.apiclient, - self.services["lbrule"], - ipaddressid=ip_with_lb_rule.ipaddress.id, - accountid=self.account.name, - networkid=self.network.id - ) - - lb_rules = LoadBalancerRule.list( - self.apiclient, - id=lb_rule.id, - listall=True - ) - self.assertEqual( - isinstance(lb_rules, list), - True, - "List LB rules should return a newly created LB rule" - ) - self.debug("Adding %s to the LB rule %s" % ( - self.virtual_machine.name, - lb_rule.name - )) - lb_rule.assign(self.apiclient, [self.virtual_machine]) - return +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +""" +BVT tests for NCC integration with cloudstack +""" +#Import Local Modules +from marvin.cloudstackTestCase import cloudstackTestCase +from marvin.lib.common import get_domain, get_zone, get_template +from marvin.lib import ncc +from marvin.lib.base import (Account, + VirtualMachine, + PublicIPAddress, + LoadBalancerRule, + ServiceOffering, + NetworkOffering, + Network, + NATRule, + PhysicalNetwork, + NetworkServiceProvider, + RegisteredServicePackage) +from marvin.lib.utils import cleanup_resources +from nose.plugins.attrib import attr +import logging + + +class TestNccIntegrationShared(cloudstackTestCase): + + @classmethod + def setUpClass(cls): + cls.testClient = super(TestNccIntegrationShared, cls).getClsTestClient() + cls.api_client = cls.testClient.getApiClient() + cls.services = cls.testClient.getParsedTestDataConfig() + cls._cleanup = [] + + cls.logger = logging.getLogger('TestNccIntegrationShared') + cls.stream_handler = logging.StreamHandler() + cls.logger.setLevel(logging.DEBUG) + cls.logger.addHandler(cls.stream_handler) + + # Get Zone, Domain and templates + cls.domain = get_domain(cls.api_client) + cls.zone = get_zone(cls.api_client, cls.testClient.getZoneForTests()) + cls.services['mode'] = cls.zone.networktype + cls.template = get_template( + cls.api_client, + cls.zone.id, + cls.services["ostype"] ) + ncc_ip=cls.services["NCC"]["NCCIP"] + ns_ip=cls.services["NSShared"]["NSIP"] + cls.debug("NS IP: Shared: %s" % ns_ip) + + mgmt_srv_ip = cls.config.__dict__["mgtSvr"][0].__dict__["mgtSvrIp"] + #ncc_ip = "10.102.195.215" + #ns_ip = "10.102.195.210" + cls.ns = ncc.NCC(ncc_ip, ns_ip, mgmt_srv_ip, logger=cls.logger) + cls.ns.registerCCP(cls.api_client) + cls.ns.registerNS() + cls.ns.assignNStoCSZone() + spname = cls.services["servicepackage_shared"]["name"] + cls.debug("SPname (Shared): %s" % spname) + #spname="SharedSP9" + # Create Service package and get device group id, tenant group id and service package id + # These would be needed later for clean up + + (cls.dv_group_id, cls.tnt_group_id, cls.srv_pkg_id) = cls.ns.createServicePackages( + spname, + "NetScalerVPX", + ns_ip) + srv_pkg_list = RegisteredServicePackage.list(cls.api_client) + # Choose the one created + cls.srv_pkg_uuid = None + for sp in srv_pkg_list: + if sp.name == spname: + cls.srv_pkg_uuid = sp.id + #srv_pkg_id = srv_pkg_list[0].id + + cls.account = Account.create( + cls.api_client, + cls.services["account"] + ) + cls._cleanup.append(cls.account) + + try: + cls.services["nw_off_ncc_SharedSP"]["servicepackageuuid"] = cls.srv_pkg_uuid + cls.services["nw_off_ncc_SharedSP"]["servicepackagedescription"] = "A NetScalerVPX is shared across all networks." + cls.network_offering = NetworkOffering.create( + cls.api_client, + cls.services["nw_off_ncc_SharedSP"]) + except Exception as e: + raise Exception ("Unable to create network offering with Service package % s due to exception % s" + % (cls.srv_pkg_uuid, e)) + + # Network offering should be removed so that service package may be deleted later + cls._cleanup.append(cls.network_offering) + + cls.network_offering.update(cls.api_client, state = "Enabled") + cls.service_offering_shared = ServiceOffering.create( + cls.api_client, + cls.services["service_offering"] + ) + cls.services["small"]["template"] = cls.template.id + + # Enable Netscaler Service Provider + + cls.phy_nws = PhysicalNetwork.list(cls.api_client,zoneid=cls.zone.id) + if isinstance(cls.phy_nws, list): + physical_network = cls.phy_nws[0] + + try: + cls.ns_service_provider = NetworkServiceProvider.list(cls.api_client,name='Netscaler') + if isinstance(cls.ns_service_provider, list): + ns_provider = cls.ns_service_provider[0] + except: + raise Exception ("Netscaler service provider not found!!") + + try: + if ns_provider.state != "Enabled": + NetworkServiceProvider.update(cls.api_client, id=ns_provider.id, physicalnetworkid=physical_network.id, state="Enabled") + except: + raise Exception ("Enabling Netscaler Service provider failed. Unable to proceed") + + return + + @classmethod + def tearDownClass(cls): + try: + # Cleanup resources used + cleanup_resources(cls.api_client, cls._cleanup) + except Exception as e: + raise Exception("Warning: Exception during cleanup : %s" % e) + cls.ns.cleanup_ncc(cls.dv_group_id, cls.srv_pkg_uuid, cls.srv_pkg_id, cls.tnt_group_id) + return + + def setUp(self): + self.apiclient = self.testClient.getApiClient() + return + + def tearDown(self): + return + + @attr(tags=["ncc"], required_hardware="true") + def test_01_shared_first_network(self): + # Create network + self.debug("Creating network with network offering: %s" % self.network_offering.id) + self.network = Network.create( + self.apiclient, + self.services["network"], + accountid=self.account.name, + domainid=self.account.domainid, + networkofferingid=self.network_offering.id, + zoneid=self.zone.id + ) + self.debug("Created network: %s" % self.network.id) + + self.debug("Trying VM deploy with network created on account: %s" % self.account.name) + + self.virtual_machine = VirtualMachine.create( + self.apiclient, + self.services["small"], + accountid=self.account.name, + domainid=self.account.domainid, + zoneid=self.zone.id, + networkids=self.network.id, + serviceofferingid=self.service_offering_shared.id) + self.debug("Deployed VM in network: %s" % self.network.id) + list_vm_response = VirtualMachine.list( + self.apiclient, + id=self.virtual_machine.id + ) + self.debug( + "Verify listVirtualMachines response for virtual machine: %s" + % self.virtual_machine.id + ) + + self.assertEqual( + isinstance(list_vm_response, list), + True, + "Check list response returns a valid list") + vm_response = list_vm_response[0] + + self.assertEqual( + vm_response.state, + "Running", + "VM state should be running after deployment" + ) + + self.debug("Acquiring public IP for network: %s" % self.network.id) + + ip_with_lb_rule = PublicIPAddress.create( + self.apiclient, + accountid=self.account.name, + zoneid=self.zone.id, + domainid=self.account.domainid, + networkid=self.network.id) + + self.debug( + "Creating LB rule for IP address: %s with round robin algo" % + ip_with_lb_rule.ipaddress.ipaddress) + + self.services["lbrule"]["alg"] = 'roundrobin' + lb_rule = LoadBalancerRule.create( + self.apiclient, + self.services["lbrule"], + ipaddressid=ip_with_lb_rule.ipaddress.id, + accountid=self.account.name, + networkid=self.network.id + ) + + lb_rules = LoadBalancerRule.list( + self.apiclient, + id=lb_rule.id, + listall=True + ) + self.assertEqual( + isinstance(lb_rules, list), + True, + "List LB rules should return a newly created LB rule" + ) + self.debug("Adding %s to the LB rule %s" % ( + self.virtual_machine.name, + lb_rule.name + )) + lb_rule.assign(self.apiclient, [self.virtual_machine]) + + @attr(tags=["ncc"], required_hardware="true") + def test_02_shared_another_network(self): + # Create network + self.debug("Creating network with network offering: %s" % self.network_offering.id) + self.network = Network.create( + self.apiclient, + self.services["network"], + accountid=self.account.name, + domainid=self.account.domainid, + networkofferingid=self.network_offering.id, + zoneid=self.zone.id + ) + self.debug("Created network: %s" % self.network.id) + + self.debug("Trying VM deploy with network created on account: %s" % self.account.name) + + self.virtual_machine = VirtualMachine.create( + self.apiclient, + self.services["small"], + accountid=self.account.name, + domainid=self.account.domainid, + networkids=self.network.id, + zoneid=self.zone.id, + serviceofferingid=self.service_offering_shared.id + ) + self.debug("Deployed VM in network: %s" % self.network.id) + list_vm_response = VirtualMachine.list( + self.apiclient, + id=self.virtual_machine.id + ) + self.debug( + "Verify listVirtualMachines response for virtual machine: %s" + % self.virtual_machine.id + ) + + self.assertEqual( + isinstance(list_vm_response, list), + True, + "Check list response returns a valid list") + vm_response = list_vm_response[0] + + self.assertEqual( + vm_response.state, + "Running", + "VM state should be running after deployment" + ) + + self.debug("Aquiring public IP for network: %s" % self.network.id) + + ip_with_lb_rule = PublicIPAddress.create( + self.apiclient, + accountid=self.account.name, + zoneid=self.zone.id, + domainid=self.account.domainid, + networkid=self.network.id) + + self.debug( + "Creating LB rule for IP address: %s with round robin algo" % + ip_with_lb_rule.ipaddress.ipaddress) + + self.services["lbrule"]["alg"] = 'roundrobin' + lb_rule = LoadBalancerRule.create( + self.apiclient, + self.services["lbrule"], + ipaddressid=ip_with_lb_rule.ipaddress.id, + accountid=self.account.name, + networkid=self.network.id + ) + + lb_rules = LoadBalancerRule.list( + self.apiclient, + id=lb_rule.id, + listall=True + ) + self.assertEqual( + isinstance(lb_rules, list), + True, + "List LB rules should return a newly created LB rule" + ) + self.debug("Adding %s to the LB rule %s" % ( + self.virtual_machine.name, + lb_rule.name + )) + lb_rule.assign(self.apiclient, [self.virtual_machine]) + return