Skip to content

Commit

Permalink
[#1580] Software Module & Distribution Set lock: add lock at rest lev…
Browse files Browse the repository at this point in the history
…el (#1646)

Signed-off-by: Marinov Avgustin <Avgustin.Marinov@bosch.com>
  • Loading branch information
avgustinmm committed Feb 15, 2024
1 parent e535420 commit 850fa35
Show file tree
Hide file tree
Showing 17 changed files with 123 additions and 35 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,43 +10,48 @@
package org.eclipse.hawkbit.repository.builder;

import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Null;
import jakarta.validation.constraints.Size;

import org.eclipse.hawkbit.repository.model.DistributionSet;
import org.eclipse.hawkbit.repository.model.NamedEntity;
import org.eclipse.hawkbit.repository.model.NamedVersionedEntity;

import java.util.Optional;

/**
* Builder to update an existing {@link DistributionSet} entry. Defines all
* fields that can be updated.
*
*/
public interface DistributionSetUpdate {
/**
* @param name
* for {@link DistributionSet#getName()}
* @param name for {@link DistributionSet#getName()}
* @return updated builder instance
*/
DistributionSetUpdate name(@Size(min = 1, max = NamedEntity.NAME_MAX_SIZE) @NotNull String name);

/**
* @param version
* for {@link DistributionSet#getVersion()}
* @param version for {@link DistributionSet#getVersion()}
* @return updated builder instance
*/
DistributionSetUpdate version(@Size(min = 1, max = NamedVersionedEntity.VERSION_MAX_SIZE) @NotNull String version);

/**
* @param description
* for {@link DistributionSet#getDescription()}
* @param description for {@link DistributionSet#getDescription()}
* @return updated builder instance
*/
DistributionSetUpdate description(@Size(max = NamedEntity.DESCRIPTION_MAX_SIZE) String description);

/**
* @param requiredMigrationStep
* for {@link DistributionSet#isRequiredMigrationStep()}
* @param locked update request if any. If not empty shall be <code>true</code>
* @return updated builder instance
*/
DistributionSetUpdate locked(@Null Boolean locked);

/**
* @param requiredMigrationStep for {@link DistributionSet#isRequiredMigrationStep()}
* @return updated builder instance
*/
DistributionSetUpdate requiredMigrationStep(Boolean requiredMigrationStep);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,4 @@ public interface SoftwareModuleBuilder {
* @return builder instance
*/
SoftwareModuleCreate create();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
*/
package org.eclipse.hawkbit.repository.builder;

import jakarta.annotation.Nullable;
import jakarta.validation.constraints.Null;
import jakarta.validation.constraints.Size;

import org.eclipse.hawkbit.repository.model.NamedEntity;
Expand All @@ -34,4 +36,10 @@ public interface SoftwareModuleUpdate {
* @return updated builder instance
*/
SoftwareModuleUpdate vendor(@Size(max = SoftwareModule.VENDOR_MAX_SIZE) String vendor);
}

/**
* @param locked update request if any. If not empty shall be <code>true</code>
* @return updated builder instance
*/
SoftwareModuleUpdate locked(@Null Boolean locked);
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,13 @@
/**
* Create and update builder DTO.
*
* @param <T>
* update or create builder interface
* @param <T> update or create builder interface
*/
public abstract class AbstractDistributionSetUpdateCreate<T> extends AbstractNamedEntityBuilder<T> {

@ValidString
protected String version;
protected Boolean requiredMigrationStep;


protected Collection<Long> modules;

public T modules(final Collection<Long> modules) {
Expand Down Expand Up @@ -55,5 +53,4 @@ public T version(final String version) {
public Optional<String> getVersion() {
return Optional.ofNullable(version);
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@

import java.util.Optional;

import jakarta.annotation.Nullable;
import jakarta.validation.constraints.Null;
import org.eclipse.hawkbit.repository.ValidString;
import org.springframework.util.StringUtils;

Expand Down Expand Up @@ -39,5 +41,4 @@ public Optional<String> getName() {
public Optional<String> getDescription() {
return Optional.ofNullable(description);
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,33 @@
*/
package org.eclipse.hawkbit.repository.builder;

import jakarta.annotation.Nullable;

import java.util.Optional;

/**
* Update implementation.
*/
public class GenericDistributionSetUpdate extends AbstractDistributionSetUpdateCreate<DistributionSetUpdate>
implements DistributionSetUpdate {

@Nullable
protected Boolean locked;

public GenericDistributionSetUpdate(final Long id) {
super.id = id;
}

}
public DistributionSetUpdate locked(@Nullable final Boolean locked) {
if (Boolean.FALSE.equals(locked)) {
this.locked = null;
} else {
this.locked = locked;
}
return this;
}

public Boolean getLocked() {
return locked;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,33 @@
*/
package org.eclipse.hawkbit.repository.builder;

import jakarta.annotation.Nullable;

import java.util.Optional;

/**
* Update implementation.
*/
public class GenericSoftwareModuleUpdate extends AbstractSoftwareModuleUpdateCreate<SoftwareModuleUpdate>
implements SoftwareModuleUpdate {

@Nullable
protected Boolean locked;

public GenericSoftwareModuleUpdate(final Long id) {
super.id = id;
}

}
public SoftwareModuleUpdate locked(@Nullable final Boolean locked) {
if (Boolean.FALSE.equals(locked)) {
this.locked = null;
} else {
this.locked = locked;
}
return this;
}

public Boolean getLocked() {
return locked;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -285,6 +285,10 @@ public DistributionSet update(final DistributionSetUpdate u) {
update.getDescription().ifPresent(set::setDescription);
update.getVersion().ifPresent(set::setVersion);

if (Boolean.TRUE.equals(update.getLocked()) && !set.isLocked()) {
set.lock();
}

if (update.isRequiredMigrationStep() != null
&& !update.isRequiredMigrationStep().equals(set.isRequiredMigrationStep())) {
assertDistributionSetIsNotAssignedToTargets(update.getId());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,9 @@ public SoftwareModule update(final SoftwareModuleUpdate u) {

update.getDescription().ifPresent(module::setDescription);
update.getVendor().ifPresent(module::setVendor);
if (Boolean.TRUE.equals(update.getLocked()) && !module.isLocked()) {
module.lock();
}

return softwareModuleRepository.save(module);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@
"type" : "os",
"typeName" : "OS",
"vendor" : "vendor Limited Inc, California",
"locked" : true,
"deleted" : false,
"encrypted" : false,
"_links" : {
Expand All @@ -77,6 +78,7 @@
"type" : "runtime",
"typeName" : "runtime",
"vendor" : "vendor GmbH, Stuttgart, Germany",
"locked" : true,
"deleted" : false,
"encrypted" : false,
"_links" : {
Expand All @@ -96,6 +98,7 @@
"type" : "application",
"typeName" : "Application",
"vendor" : "vendor Limited, California",
"locked" : true,
"deleted" : false,
"encrypted" : false,
"_links" : {
Expand Down Expand Up @@ -137,12 +140,6 @@ public class MgmtDistributionSet extends MgmtNamedEntity {
@Schema(description = "Package version", example = "1.4.2")
private String version;

@JsonProperty
@Schema(description = """
True if DS is a required migration step for another DS. As a result the DS’s assignment will not be cancelled
when another DS is assigned (note: updatable only if DS is not yet assigned to a target)""", example = "false")
private boolean requiredMigrationStep;

@JsonProperty
@Schema(description = "The type of the distribution set", example = "test_default_ds_type")
private String type;
Expand All @@ -158,6 +155,10 @@ when another DS is assigned (note: updatable only if DS is not yet assigned to a
distribution set type""", example = "true")
private Boolean complete;

@JsonProperty
@Schema(description = "If the distribution set is locked", example = "true")
private boolean locked;

@JsonProperty
@Schema(description = "Deleted flag, used for soft deleted entities", example = "false")
private boolean deleted;
Expand All @@ -167,6 +168,12 @@ when another DS is assigned (note: updatable only if DS is not yet assigned to a
example = "true")
private boolean valid;

@JsonProperty
@Schema(description = """
True if DS is a required migration step for another DS. As a result the DS’s assignment will not be cancelled
when another DS is assigned (note: updatable only if DS is not yet assigned to a target)""", example = "false")
private boolean requiredMigrationStep;

@JsonProperty
private List<MgmtSoftwareModule> modules = new ArrayList<>();
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,21 @@ public class MgmtDistributionSetRequestBodyPut {
@JsonProperty
@Schema(description = "The name of the entity", example = "dsOne")
private String name;

@JsonProperty
@Schema(description = "The description of the entity", example = "Description of the distribution set.")
private String description;

@JsonProperty
@Schema(description = "Package version", example = "1.0.0")
private String version;

@JsonProperty
@Schema(description = "Put it to true only if want to lock the distribution set. Otherwise skip it. " +
"Shall not be false!",
example = "true")
private Boolean locked;

@JsonProperty
@Schema(description = """
True if DS is a required migration step for another DS. As a result the DS’s assignment will not be cancelled
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,9 @@
"type" : "os",
"typeName" : "OS",
"vendor" : "Vendor Limited, California",
"deleted" : false,
"encrypted" : false,
"locked" : true,
"deleted" : false,
"_links" : {
"self" : {
"href" : "https://management-api.host.com/rest/v1/softwaremodules/6"
Expand Down Expand Up @@ -84,11 +85,15 @@ public class MgmtSoftwareModule extends MgmtNamedEntity {
@Schema(description = "The software vendor", example = "Vendor Limited, California")
private String vendor;

@JsonProperty
@Schema(description = "If the software module is deleted", example = "false")
private boolean deleted;

@JsonProperty
@Schema(description = "If the software module is encrypted", example = "false")
private boolean encrypted;

@JsonProperty
@Schema(description = "If the software module is locked", example = "true")
private boolean locked;

@JsonProperty
@Schema(description = "If the software module is deleted", example = "false")
private boolean deleted;
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,14 @@ public class MgmtSoftwareModuleRequestBodyPut {
@JsonProperty
@Schema(example = "SM Description")
private String description;

@JsonProperty
@Schema(example = "SM Vendor Name")
private String vendor;

@JsonProperty
@Schema(description = "Put it to true only if want to lock the software module. Otherwise skip it. " +
"Shall not be false!",
example = "true")
private Boolean locked;
}
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@ static MgmtDistributionSet toResponse(final DistributionSet distributionSet) {
response.setComplete(distributionSet.isComplete());
response.setType(distributionSet.getType().getKey());
response.setTypeName(distributionSet.getType().getName());
response.setLocked(distributionSet.isLocked());
response.setDeleted(distributionSet.isDeleted());
response.setValid(distributionSet.isValid());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -198,10 +198,10 @@ public ResponseEntity<Void> deleteDistributionSet(@PathVariable("distributionSet
public ResponseEntity<MgmtDistributionSet> updateDistributionSet(
@PathVariable("distributionSetId") final Long distributionSetId,
@RequestBody final MgmtDistributionSetRequestBodyPut toUpdate) {

final DistributionSet updated = distributionSetManagement.update(entityFactory.distributionSet()
.update(distributionSetId).name(toUpdate.getName()).description(toUpdate.getDescription())
.version(toUpdate.getVersion()).requiredMigrationStep(toUpdate.getRequiredMigrationStep()));
.version(toUpdate.getVersion()).locked(toUpdate.getLocked())
.requiredMigrationStep(toUpdate.getRequiredMigrationStep()));

final MgmtDistributionSet response = MgmtDistributionSetMapper.toResponse(updated);
MgmtDistributionSetMapper.addLinks(updated, response);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ static MgmtSoftwareModule toResponse(final SoftwareModule softwareModule) {
response.setType(softwareModule.getType().getKey());
response.setTypeName(softwareModule.getType().getName());
response.setVendor(softwareModule.getVendor());
response.setLocked(softwareModule.isLocked());
response.setDeleted(softwareModule.isDeleted());
response.setEncrypted(softwareModule.isEncrypted());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,9 @@ public ResponseEntity<MgmtSoftwareModule> updateSoftwareModule(
@RequestBody final MgmtSoftwareModuleRequestBodyPut restSoftwareModule) {
final SoftwareModule module = softwareModuleManagement
.update(entityFactory.softwareModule().update(softwareModuleId)
.description(restSoftwareModule.getDescription()).vendor(restSoftwareModule.getVendor()));
.description(restSoftwareModule.getDescription())
.vendor(restSoftwareModule.getVendor())
.locked(restSoftwareModule.getLocked()));

final MgmtSoftwareModule response = MgmtSoftwareModuleMapper.toResponse(module);
MgmtSoftwareModuleMapper.addLinks(module, response);
Expand Down

0 comments on commit 850fa35

Please sign in to comment.