Added update locked state for buckets
This commit is contained in:
parent
328f2d5011
commit
355983b764
@ -7,6 +7,8 @@ import lombok.Getter;
|
|||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import ru.dragonestia.loadbalancer.web.model.type.SlotLimit;
|
import ru.dragonestia.loadbalancer.web.model.type.SlotLimit;
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
public class Bucket {
|
public class Bucket {
|
||||||
|
|
||||||
@ -57,4 +59,8 @@ public class Bucket {
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public URI createApiURI() {
|
||||||
|
return URI.create("/nodes/" + nodeIdentifier + "/buckets/" + identifier);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,9 +2,13 @@ package ru.dragonestia.loadbalancer.web.page;
|
|||||||
|
|
||||||
import com.vaadin.flow.component.Html;
|
import com.vaadin.flow.component.Html;
|
||||||
import com.vaadin.flow.component.Unit;
|
import com.vaadin.flow.component.Unit;
|
||||||
|
import com.vaadin.flow.component.button.Button;
|
||||||
|
import com.vaadin.flow.component.html.Div;
|
||||||
import com.vaadin.flow.component.html.H2;
|
import com.vaadin.flow.component.html.H2;
|
||||||
import com.vaadin.flow.component.html.Hr;
|
import com.vaadin.flow.component.html.Hr;
|
||||||
import com.vaadin.flow.component.html.Paragraph;
|
import com.vaadin.flow.component.html.Paragraph;
|
||||||
|
import com.vaadin.flow.component.icon.Icon;
|
||||||
|
import com.vaadin.flow.component.icon.VaadinIcon;
|
||||||
import com.vaadin.flow.component.notification.Notification;
|
import com.vaadin.flow.component.notification.Notification;
|
||||||
import com.vaadin.flow.component.notification.NotificationVariant;
|
import com.vaadin.flow.component.notification.NotificationVariant;
|
||||||
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
|
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
|
||||||
@ -21,16 +25,18 @@ import ru.dragonestia.loadbalancer.web.repository.BucketRepository;
|
|||||||
import ru.dragonestia.loadbalancer.web.repository.NodeRepository;
|
import ru.dragonestia.loadbalancer.web.repository.NodeRepository;
|
||||||
|
|
||||||
@Route("/nodes/:nodeId/buckets/:bucketId")
|
@Route("/nodes/:nodeId/buckets/:bucketId")
|
||||||
public class BucketsPage extends VerticalLayout implements BeforeEnterObserver {
|
public class BucketDetailsPage extends VerticalLayout implements BeforeEnterObserver {
|
||||||
|
|
||||||
private final NodeRepository nodeRepository;
|
private final NodeRepository nodeRepository;
|
||||||
private final BucketRepository bucketRepository;
|
private final BucketRepository bucketRepository;
|
||||||
private Node node;
|
private Node node;
|
||||||
private Bucket bucket;
|
private Bucket bucket;
|
||||||
private AddUsers addUsers;
|
private AddUsers addUsers;
|
||||||
|
private Button lockBucketButton;
|
||||||
|
private VerticalLayout bucketInfo;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
public BucketsPage(NodeRepository nodeRepository, BucketRepository bucketRepository) {
|
public BucketDetailsPage(NodeRepository nodeRepository, BucketRepository bucketRepository) {
|
||||||
this.nodeRepository = nodeRepository;
|
this.nodeRepository = nodeRepository;
|
||||||
this.bucketRepository = bucketRepository;
|
this.bucketRepository = bucketRepository;
|
||||||
}
|
}
|
||||||
@ -87,11 +93,21 @@ public class BucketsPage extends VerticalLayout implements BeforeEnterObserver {
|
|||||||
add(new H2("Users"));
|
add(new H2("Users"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void updateBucketInfo() {
|
||||||
|
bucketInfo.removeAll();
|
||||||
|
bucketInfo.add(new Html("<span>Node identifier: <b>" + bucket.getNodeIdentifier() + "</b></span>"));
|
||||||
|
bucketInfo.add(new Html("<span>Bucket identifier: <b>" + bucket.getIdentifier() + "</b></span>"));
|
||||||
|
bucketInfo.add(new Html("<span>Slots: <b>" + (bucket.getSlots().isUnlimited()? "Unlimited" : bucket.getSlots().slots()) + "</b></span>"));
|
||||||
|
bucketInfo.add(new Html("<span>Locked: <b>" + (bucket.isLocked()? "Yes" : "No") + "</b></span>"));
|
||||||
|
}
|
||||||
|
|
||||||
private void printBucketDetails() {
|
private void printBucketDetails() {
|
||||||
add(new Html("<span>Node identifier: <b>" + bucket.getNodeIdentifier() + "</b></span>"));
|
add(bucketInfo = new VerticalLayout());
|
||||||
add(new Html("<span>Bucket identifier: <b>" + bucket.getIdentifier() + "</b></span>"));
|
bucketInfo.setPadding(false);
|
||||||
add(new Html("<span>Slots: <b>" + (bucket.getSlots().isUnlimited()? "Unlimited" : bucket.getSlots().slots()) + "</b></span>"));
|
|
||||||
add(new Html("<span>Locked: <b>" + (bucket.isLocked()? "Yes" : "No") + "</b></span>"));
|
updateBucketInfo();
|
||||||
|
add(lockBucketButton = new Button("", event -> changeBucketLockedState()));
|
||||||
|
setLockBucketButtonState();
|
||||||
|
|
||||||
var payload = new TextArea("Payload(" + bucket.getPayload().length() + ")");
|
var payload = new TextArea("Payload(" + bucket.getPayload().length() + ")");
|
||||||
payload.setValue(bucket.getPayload());
|
payload.setValue(bucket.getPayload());
|
||||||
@ -99,4 +115,32 @@ public class BucketsPage extends VerticalLayout implements BeforeEnterObserver {
|
|||||||
payload.setMinWidth(50, Unit.REM);
|
payload.setMinWidth(50, Unit.REM);
|
||||||
add(payload);
|
add(payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void setLockBucketButtonState() {
|
||||||
|
if (bucket.isLocked()) {
|
||||||
|
lockBucketButton.setText("Unlock");
|
||||||
|
lockBucketButton.setPrefixComponent(new Icon(VaadinIcon.UNLOCK));
|
||||||
|
} else {
|
||||||
|
lockBucketButton.setText("Lock");
|
||||||
|
lockBucketButton.setPrefixComponent(new Icon(VaadinIcon.LOCK));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void changeBucketLockedState() {
|
||||||
|
var newValue = !bucket.isLocked();
|
||||||
|
try {
|
||||||
|
bucketRepository.lock(bucket, newValue);
|
||||||
|
} catch (Error error) {
|
||||||
|
Notification.show(error.getMessage(), 3000, Notification.Position.TOP_END)
|
||||||
|
.addThemeVariants(NotificationVariant.LUMO_ERROR);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bucket.setLocked(newValue);
|
||||||
|
setLockBucketButtonState();
|
||||||
|
updateBucketInfo();
|
||||||
|
|
||||||
|
Notification.show("Success", 3000, Notification.Position.TOP_END)
|
||||||
|
.addThemeVariants(NotificationVariant.LUMO_SUCCESS);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@ -15,4 +15,6 @@ public interface BucketRepository {
|
|||||||
void remove(Bucket bucket);
|
void remove(Bucket bucket);
|
||||||
|
|
||||||
Optional<Bucket> find(Node node, String identifier);
|
Optional<Bucket> find(Node node, String identifier);
|
||||||
|
|
||||||
|
void lock(Bucket bucket, boolean value);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -79,4 +79,16 @@ public class BucketRepositoryImpl implements BucketRepository {
|
|||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void lock(Bucket bucket, boolean value) {
|
||||||
|
try {
|
||||||
|
rest.post(URI.create(bucket.createApiURI() + "/lock"), Boolean.class, params -> {
|
||||||
|
params.put("state", Boolean.toString(value));
|
||||||
|
});
|
||||||
|
} catch (Exception ex) {
|
||||||
|
log.throwing(ex);
|
||||||
|
throw new Error("Error when changing bucket locked state");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,7 +7,6 @@ import org.springframework.web.bind.annotation.*;
|
|||||||
import ru.dragonestia.loadbalancer.controller.response.BucketInfoResponse;
|
import ru.dragonestia.loadbalancer.controller.response.BucketInfoResponse;
|
||||||
import ru.dragonestia.loadbalancer.controller.response.BucketListResponse;
|
import ru.dragonestia.loadbalancer.controller.response.BucketListResponse;
|
||||||
import ru.dragonestia.loadbalancer.controller.response.BucketRegisterResponse;
|
import ru.dragonestia.loadbalancer.controller.response.BucketRegisterResponse;
|
||||||
import ru.dragonestia.loadbalancer.controller.response.NodeRegisterResponse;
|
|
||||||
import ru.dragonestia.loadbalancer.model.Bucket;
|
import ru.dragonestia.loadbalancer.model.Bucket;
|
||||||
import ru.dragonestia.loadbalancer.model.type.SlotLimit;
|
import ru.dragonestia.loadbalancer.model.type.SlotLimit;
|
||||||
import ru.dragonestia.loadbalancer.service.BucketService;
|
import ru.dragonestia.loadbalancer.service.BucketService;
|
||||||
@ -89,4 +88,28 @@ public class BucketController {
|
|||||||
return bucketOpt.map(bucket -> ResponseEntity.ok(new BucketInfoResponse(bucket)))
|
return bucketOpt.map(bucket -> ResponseEntity.ok(new BucketInfoResponse(bucket)))
|
||||||
.orElseGet(() -> ResponseEntity.notFound().build());
|
.orElseGet(() -> ResponseEntity.notFound().build());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@PostMapping("/{identifier}/lock")
|
||||||
|
ResponseEntity<Boolean> lockBucket(@PathVariable("nodeIdentifier") String nodeId,
|
||||||
|
@PathVariable("identifier") String bucketId,
|
||||||
|
@RequestParam(name = "state") boolean value) {
|
||||||
|
|
||||||
|
if (!NamingValidator.validateNodeIdentifier(nodeId) || !NamingValidator.validateBucketIdentifier(bucketId)) {
|
||||||
|
return ResponseEntity.notFound().build();
|
||||||
|
}
|
||||||
|
|
||||||
|
var nodeOpt = nodeService.findNode(nodeId);
|
||||||
|
if (nodeOpt.isEmpty()) {
|
||||||
|
return ResponseEntity.notFound().build();
|
||||||
|
}
|
||||||
|
|
||||||
|
var bucketOpt = bucketService.findBucket(Objects.requireNonNull(nodeOpt.get()), bucketId);
|
||||||
|
if (bucketOpt.isEmpty()) {
|
||||||
|
return ResponseEntity.notFound().build();
|
||||||
|
}
|
||||||
|
|
||||||
|
var bucket = bucketOpt.get();
|
||||||
|
bucket.setLocked(value);
|
||||||
|
return ResponseEntity.ok(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user