Updated Branches:
  refs/heads/rbac c440d9046 -> 3b58a45e0

ExternalUUID control support for Firewall and Egress Firewall rules


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/aaa20947
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/aaa20947
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/aaa20947

Branch: refs/heads/rbac
Commit: aaa20947a9b200f9a4abdb0977b5648c92931f68
Parents: 039b1c1
Author: Alena Prokharchyk <alena.prokharc...@citrix.com>
Authored: Tue Feb 4 16:26:53 2014 -0800
Committer: Alena Prokharchyk <alena.prokharc...@citrix.com>
Committed: Tue Feb 4 17:06:04 2014 -0800

----------------------------------------------------------------------
 api/src/com/cloud/event/EventTypes.java         |   1 +
 .../cloud/network/firewall/FirewallService.java |   2 +
 .../firewall/UpdateEgressFirewallRuleCmd.java   | 113 ++++++++++++++++++
 .../user/firewall/UpdateFirewallRuleCmd.java    | 114 +++++++++++++++++++
 client/tomcatconf/commands.properties.in        |   2 +
 .../network/firewall/FirewallManagerImpl.java   |  31 ++++-
 .../com/cloud/server/ManagementServerImpl.java  |   4 +
 .../cloud/network/MockFirewallManagerImpl.java  |   6 +
 8 files changed, 270 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa20947/api/src/com/cloud/event/EventTypes.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/event/EventTypes.java 
b/api/src/com/cloud/event/EventTypes.java
index e88f010..fdbc21f 100755
--- a/api/src/com/cloud/event/EventTypes.java
+++ b/api/src/com/cloud/event/EventTypes.java
@@ -112,6 +112,7 @@ public class EventTypes {
     public static final String EVENT_NETWORK_UPDATE = "NETWORK.UPDATE";
     public static final String EVENT_FIREWALL_OPEN = "FIREWALL.OPEN";
     public static final String EVENT_FIREWALL_CLOSE = "FIREWALL.CLOSE";
+    public static final String EVENT_FIREWALL_UPDATE = "FIREWALL.UPDATE";
 
     //NIC Events
     public static final String EVENT_NIC_CREATE = "NIC.CREATE";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa20947/api/src/com/cloud/network/firewall/FirewallService.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/firewall/FirewallService.java 
b/api/src/com/cloud/network/firewall/FirewallService.java
index 917bda3..0e4f495 100644
--- a/api/src/com/cloud/network/firewall/FirewallService.java
+++ b/api/src/com/cloud/network/firewall/FirewallService.java
@@ -50,4 +50,6 @@ public interface FirewallService {
 
     boolean revokeRelatedFirewallRule(long ruleId, boolean apply);
 
+    FirewallRule updateFirewallRule(long ruleId, String customId);
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa20947/api/src/org/apache/cloudstack/api/command/user/firewall/UpdateEgressFirewallRuleCmd.java
----------------------------------------------------------------------
diff --git 
a/api/src/org/apache/cloudstack/api/command/user/firewall/UpdateEgressFirewallRuleCmd.java
 
b/api/src/org/apache/cloudstack/api/command/user/firewall/UpdateEgressFirewallRuleCmd.java
new file mode 100644
index 0000000..690afe5
--- /dev/null
+++ 
b/api/src/org/apache/cloudstack/api/command/user/firewall/UpdateEgressFirewallRuleCmd.java
@@ -0,0 +1,113 @@
+// 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 org.apache.cloudstack.api.command.user.firewall;
+
+package org.apache.cloudstack.api.command.user.firewall;
+
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.BaseAsyncCustomIdCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.response.AccountResponse;
+import org.apache.cloudstack.api.response.FirewallResponse;
+import org.apache.cloudstack.api.response.FirewallRuleResponse;
+import org.apache.cloudstack.context.CallContext;
+import org.apache.log4j.Logger;
+
+import com.cloud.event.EventTypes;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.network.rules.FirewallRule;
+import com.cloud.network.rules.FirewallRule.TrafficType;
+
+@APICommand(name = "updateEgressFirewallRule", description = "Updates egress 
firewall rule ", responseObject = FirewallResponse.class, since = "4.4")
+public class UpdateEgressFirewallRuleCmd extends BaseAsyncCustomIdCmd {
+    public static final Logger s_logger = 
Logger.getLogger(UpdateEgressFirewallRuleCmd.class.getName());
+
+    private static final String s_name = "updateegressfirewallruleresponse";
+
+    // ///////////////////////////////////////////////////
+    // ////////////// API parameters /////////////////////
+    // ///////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = 
FirewallRuleResponse.class, required = true, description = "the ID of the 
egress firewall rule")
+    private Long id;
+
+    // unexposed parameter needed for events logging
+    @Parameter(name = ApiConstants.ACCOUNT_ID, type = CommandType.UUID, 
entityType = AccountResponse.class, expose = false)
+    private Long ownerId;
+
+    // ///////////////////////////////////////////////////
+    // ///////////////// Accessors ///////////////////////
+    // ///////////////////////////////////////////////////
+
+    public Long getId() {
+        return id;
+    }
+    // ///////////////////////////////////////////////////
+    // ///////////// API Implementation///////////////////
+    // ///////////////////////////////////////////////////
+
+    @Override
+    public String getCommandName() {
+        return s_name;
+    }
+
+    @Override
+    public void execute() throws ResourceUnavailableException {
+        CallContext.current().setEventDetails("Rule Id: " + id);
+        FirewallRule rule = _firewallService.updateFirewallRule(id, 
this.getCustomId());
+
+        FirewallResponse fwResponse = new FirewallResponse();
+        if (rule != null) {
+            fwResponse = _responseGenerator.createFirewallResponse(rule);
+            setResponseObject(fwResponse);
+        }
+        fwResponse.setResponseName(getCommandName());
+    }
+
+    @Override
+    public void checkUuid() {
+        if (this.getCustomId() != null) {
+            _uuidMgr.checkUuid(this.getCustomId(), FirewallRule.class);
+        }
+    }
+
+    @Override
+    public String getEventType() {
+        return EventTypes.EVENT_FIREWALL_UPDATE;
+
+    }
+
+    @Override
+    public String getEventDescription() {
+        return ("Updating egress firewall rule id=" + id);
+
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        if (ownerId == null) {
+            FirewallRule rule = _entityMgr.findById(FirewallRule.class, id);
+            if (rule == null || rule.getTrafficType() != TrafficType.Egress) {
+                throw new InvalidParameterValueException("Unable to find 
egress firewall rule by id");
+            } else {
+                ownerId = _entityMgr.findById(FirewallRule.class, 
id).getAccountId();
+            }
+        }
+        return ownerId;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa20947/api/src/org/apache/cloudstack/api/command/user/firewall/UpdateFirewallRuleCmd.java
----------------------------------------------------------------------
diff --git 
a/api/src/org/apache/cloudstack/api/command/user/firewall/UpdateFirewallRuleCmd.java
 
b/api/src/org/apache/cloudstack/api/command/user/firewall/UpdateFirewallRuleCmd.java
new file mode 100644
index 0000000..3fa3b9e
--- /dev/null
+++ 
b/api/src/org/apache/cloudstack/api/command/user/firewall/UpdateFirewallRuleCmd.java
@@ -0,0 +1,114 @@
+// 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 org.apache.cloudstack.api.command.user.firewall;
+
+package org.apache.cloudstack.api.command.user.firewall;
+
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.BaseAsyncCustomIdCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.response.AccountResponse;
+import org.apache.cloudstack.api.response.FirewallResponse;
+import org.apache.cloudstack.api.response.FirewallRuleResponse;
+import org.apache.cloudstack.context.CallContext;
+import org.apache.log4j.Logger;
+
+import com.cloud.event.EventTypes;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.network.rules.FirewallRule;
+import com.cloud.network.rules.FirewallRule.TrafficType;
+
+@APICommand(name = "updateFirewallRule", description = "Updates firewall rule 
", responseObject = FirewallResponse.class, since = "4.4")
+public class UpdateFirewallRuleCmd extends BaseAsyncCustomIdCmd {
+    public static final Logger s_logger = 
Logger.getLogger(UpdateFirewallRuleCmd.class.getName());
+
+    private static final String s_name = "updatefirewallruleresponse";
+
+    // ///////////////////////////////////////////////////
+    // ////////////// API parameters /////////////////////
+    // ///////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = 
FirewallRuleResponse.class, required = true, description = "the ID of the 
firewall rule")
+    private Long id;
+
+    // unexposed parameter needed for events logging
+    @Parameter(name = ApiConstants.ACCOUNT_ID, type = CommandType.UUID, 
entityType = AccountResponse.class, expose = false)
+    private Long ownerId;
+
+    // ///////////////////////////////////////////////////
+    // ///////////////// Accessors ///////////////////////
+    // ///////////////////////////////////////////////////
+
+    public Long getId() {
+        return id;
+    }
+
+    // ///////////////////////////////////////////////////
+    // ///////////// API Implementation///////////////////
+    // ///////////////////////////////////////////////////
+
+    @Override
+    public String getCommandName() {
+        return s_name;
+    }
+
+    @Override
+    public void execute() throws ResourceUnavailableException {
+        CallContext.current().setEventDetails("Rule Id: " + id);
+        FirewallRule rule = _firewallService.updateFirewallRule(id, 
this.getCustomId());
+
+        FirewallResponse fwResponse = new FirewallResponse();
+        if (rule != null) {
+            fwResponse = _responseGenerator.createFirewallResponse(rule);
+            setResponseObject(fwResponse);
+        }
+        fwResponse.setResponseName(getCommandName());
+    }
+
+    @Override
+    public void checkUuid() {
+        if (this.getCustomId() != null) {
+            _uuidMgr.checkUuid(this.getCustomId(), FirewallRule.class);
+        }
+    }
+
+    @Override
+    public String getEventType() {
+        return EventTypes.EVENT_FIREWALL_UPDATE;
+
+    }
+
+    @Override
+    public String getEventDescription() {
+        return ("Updating firewall rule id=" + id);
+
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        if (ownerId == null) {
+            FirewallRule rule = _entityMgr.findById(FirewallRule.class, id);
+            if (rule == null || rule.getTrafficType() != TrafficType.Ingress) {
+                throw new InvalidParameterValueException("Unable to find 
firewall rule by id");
+            } else {
+                ownerId = _entityMgr.findById(FirewallRule.class, 
id).getAccountId();
+            }
+        }
+        return ownerId;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa20947/client/tomcatconf/commands.properties.in
----------------------------------------------------------------------
diff --git a/client/tomcatconf/commands.properties.in 
b/client/tomcatconf/commands.properties.in
index aecc912..27ed6cf 100644
--- a/client/tomcatconf/commands.properties.in
+++ b/client/tomcatconf/commands.properties.in
@@ -401,11 +401,13 @@ deleteProjectInvitation=15
 createFirewallRule=15
 deleteFirewallRule=15
 listFirewallRules=15
+updateFirewallRule=15
 
 ####
 createEgressFirewallRule=15
 deleteEgressFirewallRule=15
 listEgressFirewallRules=15
+updateEgressFirewallRule=15
 
 #### hypervisor capabilities commands
 updateHypervisorCapabilities=1

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa20947/server/src/com/cloud/network/firewall/FirewallManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/firewall/FirewallManagerImpl.java 
b/server/src/com/cloud/network/firewall/FirewallManagerImpl.java
index 448abe3..593c0b5 100644
--- a/server/src/com/cloud/network/firewall/FirewallManagerImpl.java
+++ b/server/src/com/cloud/network/firewall/FirewallManagerImpl.java
@@ -27,13 +27,12 @@ import javax.ejb.Local;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
-import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
-
 import org.apache.cloudstack.api.command.user.firewall.ListFirewallRulesCmd;
 import org.apache.cloudstack.context.CallContext;
 import 
org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
 import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
 
 import com.cloud.configuration.Config;
 import com.cloud.domain.dao.DomainDao;
@@ -717,6 +716,32 @@ public class FirewallManagerImpl extends ManagerBase 
implements FirewallService,
     }
 
     @Override
+    @ActionEvent(eventType = EventTypes.EVENT_FIREWALL_UPDATE, 
eventDescription = "updating firewall rule", async = true)
+    public FirewallRule updateFirewallRule(long ruleId, String customId) {
+        Account caller = CallContext.current().getCallingAccount();
+        return updateFirewallRule(ruleId, customId, caller);
+    }
+
+    protected FirewallRule updateFirewallRule(long ruleId, String customId, 
Account caller) {
+        FirewallRuleVO rule = _firewallDao.findById(ruleId);
+        if (rule == null || rule.getPurpose() != Purpose.Firewall) {
+            throw new InvalidParameterValueException("Unable to find " + 
ruleId + " having purpose " + Purpose.Firewall);
+        }
+
+        if (rule.getType() == FirewallRuleType.System && caller.getType() != 
Account.ACCOUNT_TYPE_ADMIN) {
+            throw new InvalidParameterValueException("Only root admin can 
update the system wide firewall rule");
+        }
+
+        _accountMgr.checkAccess(caller, null, true, rule);
+
+        if (customId != null) {
+            rule.setUuid(customId);
+            _firewallDao.update(ruleId, rule);
+        }
+        return _firewallDao.findById(ruleId);
+    }
+
+    @Override
     @DB
     public void revokeRule(final FirewallRuleVO rule, Account caller, long 
userId, final boolean needUsageEvent) {
         if (caller != null) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa20947/server/src/com/cloud/server/ManagementServerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/server/ManagementServerImpl.java 
b/server/src/com/cloud/server/ManagementServerImpl.java
index 449e879..9dc9dda 100755
--- a/server/src/com/cloud/server/ManagementServerImpl.java
+++ b/server/src/com/cloud/server/ManagementServerImpl.java
@@ -255,6 +255,8 @@ import 
org.apache.cloudstack.api.command.user.firewall.DeletePortForwardingRuleC
 import 
org.apache.cloudstack.api.command.user.firewall.ListEgressFirewallRulesCmd;
 import org.apache.cloudstack.api.command.user.firewall.ListFirewallRulesCmd;
 import 
org.apache.cloudstack.api.command.user.firewall.ListPortForwardingRulesCmd;
+import 
org.apache.cloudstack.api.command.user.firewall.UpdateEgressFirewallRuleCmd;
+import org.apache.cloudstack.api.command.user.firewall.UpdateFirewallRuleCmd;
 import 
org.apache.cloudstack.api.command.user.firewall.UpdatePortForwardingRuleCmd;
 import org.apache.cloudstack.api.command.user.guest.ListGuestOsCategoriesCmd;
 import org.apache.cloudstack.api.command.user.guest.ListGuestOsCmd;
@@ -2861,6 +2863,8 @@ public class ManagementServerImpl extends ManagerBase 
implements ManagementServe
         cmdList.add(ListOvsElementsCmd.class);
         cmdList.add(ConfigureOvsElementCmd.class);
         cmdList.add(GetVMUserDataCmd.class);
+        cmdList.add(UpdateEgressFirewallRuleCmd.class);
+        cmdList.add(UpdateFirewallRuleCmd.class);
         return cmdList;
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa20947/server/test/com/cloud/network/MockFirewallManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/network/MockFirewallManagerImpl.java 
b/server/test/com/cloud/network/MockFirewallManagerImpl.java
index 3fbbcdf..b306976 100644
--- a/server/test/com/cloud/network/MockFirewallManagerImpl.java
+++ b/server/test/com/cloud/network/MockFirewallManagerImpl.java
@@ -184,4 +184,10 @@ public class MockFirewallManagerImpl extends ManagerBase 
implements FirewallMana
         return null;
     }
 
+    @Override
+    public FirewallRule updateFirewallRule(long ruleId, String customId) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
 }

Reply via email to