Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
78 commits
Select commit Hold shift + click to select a range
522c542
Support for live patching systemVMs and deprecating systemVM.iso. Inc…
Pearl1594 Dec 7, 2021
50c59bc
The following commit:
Pearl1594 Dec 14, 2021
5cb090d
- Support to patch SystemVMs - VMWare
Pearl1594 Dec 14, 2021
86bc3bf
Commit comprises of:
Pearl1594 Dec 21, 2021
5a27cb7
Add ssh to k8s nodes details in the Access tab on the UI
Pearl1594 Dec 21, 2021
9c182db
test
Pearl1594 Dec 22, 2021
8f1e3a3
Refactor ca/cert patching logic
Pearl1594 Dec 24, 2021
9fef181
Commit comprises of the following changes:
Pearl1594 Dec 29, 2021
bdaa364
remove all references of systemvm.iso
Pearl1594 Dec 31, 2021
b923ed2
Fix keystore-cert-import invocation + refactor cert timeout in CP/SS VMs
Pearl1594 Jan 3, 2022
a380f68
fix script timeout
Pearl1594 Jan 3, 2022
447ae42
Refactor cert patching for systemVMs + update keystore-cert-import sc…
Pearl1594 Jan 5, 2022
c7e79ec
remove commented code + change core user to cloud for cks nodes
Pearl1594 Jan 7, 2022
e3d0051
Update ownership of ssh directory
Pearl1594 Jan 7, 2022
84f31ac
NEED TO DISCUSS - add on the fly template conversion as an ExecStartP…
Pearl1594 Jan 10, 2022
da5bba8
Add UI changes + move changes from patch file to runcmd
Pearl1594 Jan 19, 2022
0ccf346
test: validate performance for template modification during seeding
Pearl1594 Jan 19, 2022
b07f20d
create vms folder in cloudstack-commons directory - debian rules
Pearl1594 Jan 20, 2022
9137261
remove logic for on the fly template convert + update k8s test
Pearl1594 Jan 21, 2022
554e7c8
fix syntax issue - causing issue with shared network tests
Pearl1594 Jan 22, 2022
9781668
Code cleanup
Pearl1594 Jan 27, 2022
6244ca4
refactor patching logic - certs
Pearl1594 Feb 1, 2022
0196929
move logic of fixing rootdiskcontroller from upgrade to kubernetes se…
Pearl1594 Feb 1, 2022
21f0cf5
add livepatch option to restart network & vpc
Pearl1594 Feb 2, 2022
92c71c0
smooth upgrade of cks clusters
Pearl1594 Feb 2, 2022
c7fd6de
Support for live patching systemVMs and deprecating systemVM.iso. Inc…
Pearl1594 Dec 7, 2021
65a8762
The following commit:
Pearl1594 Dec 14, 2021
ce92de4
- Support to patch SystemVMs - VMWare
Pearl1594 Dec 14, 2021
f1e71aa
Commit comprises of:
Pearl1594 Dec 21, 2021
abc5732
Add ssh to k8s nodes details in the Access tab on the UI
Pearl1594 Dec 21, 2021
2960d58
test
Pearl1594 Dec 22, 2021
87f1b73
Refactor ca/cert patching logic
Pearl1594 Dec 24, 2021
10f6d33
Commit comprises of the following changes:
Pearl1594 Dec 29, 2021
da7db39
remove all references of systemvm.iso
Pearl1594 Dec 31, 2021
ec5d082
Fix keystore-cert-import invocation + refactor cert timeout in CP/SS VMs
Pearl1594 Jan 3, 2022
6c190d1
fix script timeout
Pearl1594 Jan 3, 2022
3a27954
Refactor cert patching for systemVMs + update keystore-cert-import sc…
Pearl1594 Jan 5, 2022
e678b46
remove commented code + change core user to cloud for cks nodes
Pearl1594 Jan 7, 2022
0293ab7
Update ownership of ssh directory
Pearl1594 Jan 7, 2022
f37d74f
NEED TO DISCUSS - add on the fly template conversion as an ExecStartP…
Pearl1594 Jan 10, 2022
ff7d4ed
Add UI changes + move changes from patch file to runcmd
Pearl1594 Jan 19, 2022
e6f9c29
test: validate performance for template modification during seeding
Pearl1594 Jan 19, 2022
ebfd912
create vms folder in cloudstack-commons directory - debian rules
Pearl1594 Jan 20, 2022
f130b25
remove logic for on the fly template convert + update k8s test
Pearl1594 Jan 21, 2022
8937867
fix syntax issue - causing issue with shared network tests
Pearl1594 Jan 22, 2022
d306404
Code cleanup
Pearl1594 Jan 27, 2022
0174903
Merge branch 'sysvm-optimizations-v2' of github.com:shapeblue/cloudst…
Pearl1594 Feb 2, 2022
a1968e3
Merge branch 'main' of https://github.com/apache/cloudstack into sysv…
Pearl1594 Feb 8, 2022
420f54a
add cgroup config for containerd
Pearl1594 Feb 9, 2022
62c274f
add systemd config for kubelet
Pearl1594 Feb 10, 2022
79792e3
add additional info during image registry config
Pearl1594 Feb 11, 2022
e42b5cf
address comments
Pearl1594 Feb 14, 2022
c6e7dc7
Merge branch 'main' of https://github.com/apache/cloudstack into sysv…
Pearl1594 Feb 21, 2022
ed18685
add temp links of download.cloudstack.org
Pearl1594 Feb 21, 2022
ff386ac
address part of the comments
Pearl1594 Feb 22, 2022
c6412a8
Merge branch 'main' of https://github.com/apache/cloudstack into sysv…
Pearl1594 Mar 9, 2022
fb1678c
address comments
Pearl1594 Mar 10, 2022
bc961f7
Merge branch 'main' of https://github.com/apache/cloudstack into sysv…
Pearl1594 Mar 15, 2022
cb47ea4
update containerd config - as version has upgraded to 1.5 from 1.4.12…
Pearl1594 Mar 16, 2022
0589ef8
address comments - simplify
Pearl1594 Mar 17, 2022
e40625e
fix vue3 related icon changes
Pearl1594 Mar 22, 2022
3d1ec29
allow network commands when router template version is lower but is p…
Pearl1594 Mar 25, 2022
971eac5
add internal LB to the list of routers to be patched on network resta…
Pearl1594 Mar 25, 2022
df9355f
Merge branch 'main' of https://github.com/apache/cloudstack into sysv…
Pearl1594 Apr 6, 2022
41e6738
add unit tests for API param validations and new helper utilities - f…
Pearl1594 Apr 6, 2022
06791f4
perform patching only for non-user i.e., system VMs
Pearl1594 Apr 11, 2022
a12789d
add test to validate params
Pearl1594 Apr 12, 2022
f10d925
Merge branch 'main' of https://github.com/apache/cloudstack into sysv…
Pearl1594 Apr 12, 2022
e35d51d
remove unused import
Pearl1594 Apr 12, 2022
a44ef85
Merge branch 'main' of https://github.com/apache/cloudstack into sysv…
Pearl1594 Apr 18, 2022
8e9175b
add column to domain_router to display software version and support n…
Pearl1594 Apr 19, 2022
e409227
Merge branch 'main' of https://github.com/apache/cloudstack into sysv…
Pearl1594 Apr 19, 2022
809ea91
Merge branch 'main' into sysvm-optimizations-v2
Pearl1594 Apr 20, 2022
30c00e6
Requires upgrade column to consider package (cloud-scripts) checksum …
Pearl1594 Apr 20, 2022
47693fd
use router software version instead of checksum
Pearl1594 Apr 20, 2022
75b46b2
show N/A if no software version reported i.e., in upgraded envs
Pearl1594 Apr 20, 2022
cec9c82
fix deb failure
Pearl1594 Apr 20, 2022
de0ce15
update pom to official links of systemVM template
Pearl1594 Apr 21, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions agent/src/main/java/com/cloud/agent/Agent.java
Original file line number Diff line number Diff line change
Expand Up @@ -763,8 +763,10 @@ private Answer setupAgentCertificate(final SetupCertificateCommand cmd) {
throw new CloudRuntimeException("Unable to save received agent client and ca certificates", e);
}

String ksPassphrase = _shell.getPersistentProperty(null, KeyStoreUtils.KS_PASSPHRASE_PROPERTY);
Script script = new Script(_keystoreCertImportPath, 300000, s_logger);
script.add(agentFile.getAbsolutePath());
script.add(ksPassphrase);
script.add(keyStoreFile);
script.add(KeyStoreUtils.AGENT_MODE);
script.add(certFile);
Expand Down
4 changes: 4 additions & 0 deletions api/src/main/java/com/cloud/event/EventTypes.java
Original file line number Diff line number Diff line change
Expand Up @@ -637,6 +637,9 @@ public class EventTypes {
// Storage Policies
public static final String EVENT_IMPORT_VCENTER_STORAGE_POLICIES = "IMPORT.VCENTER.STORAGE.POLICIES";

// SystemVM
public static final String EVENT_LIVE_PATCH_SYSTEMVM = "LIVE.PATCH.SYSTEM.VM";

static {

// TODO: need a way to force author adding event types to declare the entity details as well, with out braking
Expand Down Expand Up @@ -1048,6 +1051,7 @@ public class EventTypes {
entityEventDetails.put(EVENT_IMPORT_VCENTER_STORAGE_POLICIES, "StoragePolicies");

entityEventDetails.put(EVENT_IMAGE_STORE_DATA_MIGRATE, ImageStore.class);
entityEventDetails.put(EVENT_LIVE_PATCH_SYSTEMVM, "SystemVMs");
}

public static String getEntityForEvent(String eventName) {
Expand Down
2 changes: 1 addition & 1 deletion api/src/main/java/com/cloud/network/NetworkService.java
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ IpAddress allocatePortableIP(Account ipOwner, int regionId, Long zoneId, Long ne

boolean deleteNetwork(long networkId, boolean forced);

boolean restartNetwork(Long networkId, boolean cleanup, boolean makeRedundant, User user) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException;
boolean restartNetwork(Long networkId, boolean cleanup, boolean makeRedundant, boolean livePatch, User user) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException;

boolean restartNetwork(RestartNetworkCmd cmd) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException;

Expand Down
2 changes: 2 additions & 0 deletions api/src/main/java/com/cloud/network/router/VirtualRouter.java
Original file line number Diff line number Diff line change
Expand Up @@ -52,4 +52,6 @@ public enum RedundantState {
Long getVpcId();

String getTemplateVersion();

String getScriptsVersion();
}
2 changes: 1 addition & 1 deletion api/src/main/java/com/cloud/network/vpc/VpcService.java
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ public Pair<List<? extends Vpc>, Integer> listVpcs(Long id, String vpcName, Stri
*/
boolean restartVpc(RestartVPCCmd cmd) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException;

boolean restartVpc(Long networkId, boolean cleanup, boolean makeRedundant, User user) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException;
boolean restartVpc(Long networkId, boolean cleanup, boolean makeRedundant, boolean livePatch, User user) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException;

/**
* Returns a Private gateway found in the VPC by id
Expand Down
2 changes: 2 additions & 0 deletions api/src/main/java/com/cloud/server/ManagementService.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
import org.apache.cloudstack.api.command.admin.resource.UploadCustomCertificateCmd;
import org.apache.cloudstack.api.command.admin.systemvm.DestroySystemVmCmd;
import org.apache.cloudstack.api.command.admin.systemvm.ListSystemVMsCmd;
import org.apache.cloudstack.api.command.admin.systemvm.PatchSystemVMCmd;
import org.apache.cloudstack.api.command.admin.systemvm.RebootSystemVmCmd;
import org.apache.cloudstack.api.command.admin.systemvm.ScaleSystemVMCmd;
import org.apache.cloudstack.api.command.admin.systemvm.StopSystemVmCmd;
Expand Down Expand Up @@ -428,5 +429,6 @@ VirtualMachine upgradeSystemVM(ScaleSystemVMCmd cmd) throws ResourceUnavailableE

void cleanupVMReservations();

Pair<Boolean, String> patchSystemVM(PatchSystemVMCmd cmd);

}
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ public class ApiConstants {
public static final String USER_API_KEY = "userapikey";
public static final String APPLIED = "applied";
public static final String LIST_LB_VMIPS = "lbvmips";
public static final String LIVE_PATCH = "livepatch";
public static final String AVAILABLE = "available";
public static final String BACKUP_ID = "backupid";
public static final String BACKUP_OFFERING_NAME = "backupofferingname";
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
// 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.admin.systemvm;

import com.cloud.event.EventTypes;
import com.cloud.user.Account;
import com.cloud.utils.Pair;
import com.cloud.vm.VirtualMachine;
import org.apache.cloudstack.acl.RoleType;
import org.apache.cloudstack.api.APICommand;
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.api.ApiErrorCode;
import org.apache.cloudstack.api.BaseAsyncCmd;
import org.apache.cloudstack.api.BaseCmd;
import org.apache.cloudstack.api.Parameter;
import org.apache.cloudstack.api.ServerApiException;
import org.apache.cloudstack.api.response.SuccessResponse;
import org.apache.cloudstack.api.response.SystemVmResponse;
import org.apache.cloudstack.context.CallContext;
import org.apache.log4j.Logger;

@APICommand(name = PatchSystemVMCmd.APINAME, description = "Attempts to live patch systemVMs - CPVM, SSVM ",
responseObject = SuccessResponse.class, requestHasSensitiveInfo = false,
responseHasSensitiveInfo = false, authorized = { RoleType.Admin }, since = "4.17.0")
public class PatchSystemVMCmd extends BaseAsyncCmd {
public static final Logger s_logger = Logger.getLogger(PatchSystemVMCmd.class.getName());
public static final String APINAME = "patchSystemVm";

/////////////////////////////////////////////////////
//////////////// API parameters /////////////////////
/////////////////////////////////////////////////////
@Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = SystemVmResponse.class,
description = "patches systemVM - CPVM/SSVM with the specified ID")
private Long id;

@Parameter(name = ApiConstants.FORCED, type = CommandType.BOOLEAN,
description = "If true, initiates copy of scripts and restart of the agent, even if the scripts version matches." +
"To be used with ID parameter only")
private Boolean force;

/////////////////////////////////////////////////////
/////////////////// Accessors ///////////////////////
/////////////////////////////////////////////////////


public Long getId() {
return id;
}

public boolean isForced() {
return force != null && force;
}

/////////////////////////////////////////////////////
/////////////// API Implementation///////////////////
/////////////////////////////////////////////////////

@Override
public String getEventType() {
return EventTypes.EVENT_LIVE_PATCH_SYSTEMVM;
}

@Override
public String getEventDescription() {
return String.format("Attempting to live patch System VM with Id: %s ", this._uuidMgr.getUuid(VirtualMachine.class, getId()));
}

@Override
public String getCommandName() {
return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX;
}

@Override
public long getEntityOwnerId() {
Account account = CallContext.current().getCallingAccount();
if (account != null) {
return account.getId();
}

return Account.ACCOUNT_ID_SYSTEM;
}

@Override
public void execute() {
Pair<Boolean, String> patched = _mgr.patchSystemVM(this);
if (patched.first()) {
final SuccessResponse response = new SuccessResponse(getCommandName());
response.setDisplayText(patched.second());
setResponseObject(response);
} else {
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, patched.second());
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,11 @@ public class RestartNetworkCmd extends BaseAsyncCmd {
@Parameter(name = ApiConstants.MAKEREDUNDANT, type = CommandType.BOOLEAN, required = false, description = "Turn the network into a network with redundant routers.", since = "4.11.1")
private Boolean makeRedundant = false;

@Parameter(name = ApiConstants.LIVE_PATCH, type = CommandType.BOOLEAN, required = false,
description = "Live patches the router software before restarting it. This parameter will only work when 'cleanup' is false.",
since = "4.17.0")
private Boolean livePatch = false;

/////////////////////////////////////////////////////
/////////////////// Accessors ///////////////////////
/////////////////////////////////////////////////////
Expand All @@ -81,6 +86,8 @@ public Boolean getMakeRedundant() {
return makeRedundant;
}

public Boolean getLivePatch() { return livePatch; }

/////////////////////////////////////////////////////
/////////////// API Implementation///////////////////
/////////////////////////////////////////////////////
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,11 @@ public class RestartVPCCmd extends BaseAsyncCmd {
@Parameter(name = ApiConstants.MAKEREDUNDANT, type = CommandType.BOOLEAN, required = false, description = "Turn a single VPC into a redundant one.")
private Boolean makeredundant = false;

@Parameter(name = ApiConstants.LIVE_PATCH, type = CommandType.BOOLEAN, required = false,
description = "Live patches the router software before restarting it. This parameter will only work when 'cleanup' is false.",
since = "4.17.0")
private Boolean livePatch = false;
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same comment as above, see comment for restart network cmd.


/////////////////////////////////////////////////////
/////////////////// Accessors ///////////////////////
/////////////////////////////////////////////////////
Expand All @@ -70,6 +75,8 @@ public Boolean getMakeredundant() {
return makeredundant;
}

public Boolean getLivePatch() { return livePatch; }

/////////////////////////////////////////////////////
/////////////// API Implementation///////////////////
/////////////////////////////////////////////////////
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,10 @@ public class DomainRouterResponse extends BaseResponseWithAnnotations implements
@Param(description = "Last executed health check result for the router", responseObject = RouterHealthCheckResultResponse.class, since = "4.14")
List<RouterHealthCheckResultResponse> healthCheckResults;

@SerializedName("softwareversion")
@Param(description = "the version of the code / software in the router")
private String softwareVersion;

public DomainRouterResponse() {
nics = new LinkedHashSet<NicResponse>();
}
Expand Down Expand Up @@ -490,4 +494,12 @@ public void setHealthChecksFailed(boolean healthChecksFailed) {
public void setHealthCheckResults(List<RouterHealthCheckResultResponse> healthCheckResults) {
this.healthCheckResults = healthCheckResults;
}

public String getSoftwareVersion() {
return softwareVersion;
}

public void setSoftwareVersion(String softwareVersion) {
this.softwareVersion = softwareVersion;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +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.A
package org.apache.cloudstack.api.command.admin.systemvm;

import com.cloud.server.ManagementService;
import com.cloud.user.Account;
import com.cloud.utils.Pair;
import org.apache.cloudstack.context.CallContext;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.springframework.test.util.ReflectionTestUtils;

@RunWith(PowerMockRunner.class)
@PrepareForTest(CallContext.class)
@PowerMockIgnore({"javax.xml.*", "org.w3c.dom.*", "org.apache.xerces.*", "org.xml.*"})
public class PatchSystemVMCmdTest {

@Mock
private ManagementService _mgr;

@InjectMocks
PatchSystemVMCmd cmd = new PatchSystemVMCmd();

@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
}

@Test
public void patchValidSystemVM() {
ReflectionTestUtils.setField(cmd, "id", 1L);
Pair successResponse = new Pair<>(true, "");
Mockito.doReturn(successResponse).when(_mgr).patchSystemVM(cmd);
try {
cmd.execute();
} catch (Exception e) {
e.printStackTrace();
}
}

@Test
public void patchInvalidSystemVM() {
ReflectionTestUtils.setField(cmd, "id", null);
Pair<Boolean, String> failureResponse = new Pair<>(false, "Please provide a valid ID of a system VM to be patched");
Mockito.doReturn(failureResponse).when(_mgr).patchSystemVM(cmd);
try {
cmd.execute();
} catch (Exception e) {
Assert.assertEquals(failureResponse.second(), e.getMessage());
}
}

@Test
public void validateArgsForPatchSystemVMApi() {
PowerMockito.mockStatic(CallContext.class);
CallContext callContextMock = PowerMockito.mock(CallContext.class);
PowerMockito.when(CallContext.current()).thenReturn(callContextMock);
Account accountMock = PowerMockito.mock(Account.class);
PowerMockito.when(callContextMock.getCallingAccount()).thenReturn(accountMock);
Mockito.when(accountMock.getId()).thenReturn(2L);
ReflectionTestUtils.setField(cmd, "id", 1L);
Assert.assertEquals((long)cmd.getId(), 1L);
Assert.assertFalse(cmd.isForced());
Assert.assertEquals(cmd.getEntityOwnerId(), 2L);


}
}
26 changes: 0 additions & 26 deletions client/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -890,32 +890,6 @@
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.7</version>
<executions>
<!-- Copy the systemvm in the package phase as it is generated by console-proxy in the package
phase. -->
<execution>
<id>copy-systemvm</id>
<phase>process-resources</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<target>
<copy todir="${basedir}/target/common/vms">
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

:D so good to see old/archaic code gone

<fileset dir="${basedir}/../systemvm/dist">
<include name="systemvm.iso" />
</fileset>
</copy>
</target>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
Expand Down
Loading