Skip to content

Commit

Permalink
feat: added image managemnt to container dashboard (#3968)
Browse files Browse the repository at this point in the history
  • Loading branch information
GregoryIvo authored Apr 29, 2022
1 parent ca121c9 commit 0a5c49b
Show file tree
Hide file tree
Showing 7 changed files with 441 additions and 62 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
ui:field="profile" active="true"/>
<b:TabListItem dataTarget="#bundlesPanel" text="Bundles"
ui:field="bundles" />
<b:TabListItem dataTarget="#dockerContainersPanel" text="Docker Containers"
<b:TabListItem dataTarget="#dockerContainersPanel" text="Containers"
ui:field="containers" />
<b:TabListItem dataTarget="#threadsPanel" text="Threads"
ui:field="threads" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
*******************************************************************************/
package org.eclipse.kura.web.client.ui.device;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.kura.web.client.messages.Messages;
Expand All @@ -22,6 +23,9 @@
import org.eclipse.kura.web.client.util.FailureHandler;
import org.eclipse.kura.web.shared.ForwardedEventTopic;
import org.eclipse.kura.web.shared.model.GwtGroupedNVPair;
import org.eclipse.kura.web.shared.model.GwtModemInterfaceConfig;
import org.eclipse.kura.web.shared.model.GwtNetIfType;
import org.eclipse.kura.web.shared.model.GwtNetInterfaceConfig;
import org.eclipse.kura.web.shared.model.GwtXSRFToken;
import org.eclipse.kura.web.shared.service.GwtDeviceService;
import org.eclipse.kura.web.shared.service.GwtDeviceServiceAsync;
Expand All @@ -37,6 +41,7 @@
import com.google.gwt.user.cellview.client.TextHeader;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.view.client.ListDataProvider;
import com.google.gwt.view.client.SingleSelectionModel;
Expand All @@ -58,6 +63,26 @@ interface DockerContainersTabUiUiBinder extends UiBinder<Widget, DockerContainer

private boolean isRequestRunning = false;

/**
* Switcher Related
*/

@UiField
Panel containerListPanel;

@UiField
Panel imageListPanel;

@UiField
CellTable<GwtGroupedNVPair> assetGrid = new CellTable<>();

private final ListDataProvider<GwtGroupedNVPair> assetSwitcherProvider = new ListDataProvider<>();
final SingleSelectionModel<GwtGroupedNVPair> switcherSelectionModel = new SingleSelectionModel<>();

/**
* Container View Related
*/

@UiField
Button containersRefresh;
@UiField
Expand All @@ -70,12 +95,28 @@ interface DockerContainersTabUiUiBinder extends UiBinder<Widget, DockerContainer
private final ListDataProvider<GwtGroupedNVPair> bundlesDataProvider = new ListDataProvider<>();
private final SingleSelectionModel<GwtGroupedNVPair> selectionModel = new SingleSelectionModel<>();

/**
* Images View Related
*/

@UiField
Button imagesDelete;
@UiField
Button imagesRefresh;

@UiField
CellTable<GwtGroupedNVPair> imagesGrid = new CellTable<>();
private final ListDataProvider<GwtGroupedNVPair> imagesDataProvider = new ListDataProvider<>();
private final SingleSelectionModel<GwtGroupedNVPair> imagesSelectionModel = new SingleSelectionModel<>();

private final GwtDeviceServiceAsync deviceService = GWT.create(GwtDeviceService.class);
private final GwtSecurityTokenServiceAsync securityTokenService = GWT.create(GwtSecurityTokenService.class);

public DockerContainersTabUi() {
initWidget(uiBinder.createAndBindUi(this));
loadContainersTable(this.bundlesGrid, this.bundlesDataProvider);
loadImagesTable(this.imagesGrid, this.imagesDataProvider);
initTableSwitcher();

this.containersRefresh.setText(MSGS.refresh());
this.containersStart.setText(MSGS.deviceTabContainerStart());
Expand All @@ -88,11 +129,25 @@ public DockerContainersTabUi() {
this.containersStart.addClickHandler(event -> startSelectedContainer());
this.containersStop.addClickHandler(event -> stopSelectedContainer());

this.switcherSelectionModel.addSelectionChangeHandler(event -> updateSelectedPanels());

updateButtons();

this.imagesRefresh.setText(MSGS.refresh());
this.imagesDelete.setText(MSGS.deviceTabContainerImagesDelete());

this.imagesSelectionModel.clear();
this.imagesGrid.setSelectionModel(this.imagesSelectionModel);
this.imagesSelectionModel.addSelectionChangeHandler(event -> updateImageButtons());
this.imagesDelete.addClickHandler(event -> deleteSelectedImage());
this.imagesRefresh.addClickHandler(event -> refresh());

updateImageButtons();

EventService.Handler onBundleUpdatedHandler = eventInfo -> {
if (DockerContainersTabUi.this.isVisible() && DockerContainersTabUi.this.isAttached()) {
refresh();
updateImageButtons();
}
};

Expand Down Expand Up @@ -121,6 +176,105 @@ private void updateButtons() {

}

private void updateSelectedPanels() {
GwtGroupedNVPair selected = this.switcherSelectionModel.getSelectedObject();

if (selected == null || (selected.getName()) == null) {
return;
}

if (selected.getName().equals(MSGS.deviceTabContainerSwitcherGridImagesText())) {
imageListPanel.setVisible(true);
containerListPanel.setVisible(false);
} else {
imageListPanel.setVisible(false);
containerListPanel.setVisible(true);
}
}

private void initTableSwitcher() {

imageListPanel.setVisible(false);
containerListPanel.setVisible(true);

List<GwtGroupedNVPair> typeList = new ArrayList<>();
GwtGroupedNVPair containers = new GwtGroupedNVPair();
containers.setName(MSGS.deviceTabContainerSwitcherGridContainerText());
GwtGroupedNVPair images = new GwtGroupedNVPair();
images.setName(MSGS.deviceTabContainerSwitcherGridImagesText());
typeList.add(containers);
typeList.add(images);

this.assetSwitcherProvider.getList().addAll(typeList);

TextColumn<GwtGroupedNVPair> switcherCol1 = new TextColumn<GwtGroupedNVPair>() {

@Override
public String getValue(GwtGroupedNVPair object) {
return object.getName();
}
};
switcherCol1.setCellStyleNames(STATUS_TABLE_ROW_STYLE);
switcherCol1.setSortable(true);
this.assetGrid.addColumn(switcherCol1, MSGS.deviceTabContainerSwitcherGridHeading());

this.assetSwitcherProvider.addDataDisplay(this.assetGrid);
this.assetGrid.setSelectionModel(this.switcherSelectionModel);

this.assetGrid.getColumnSortList().push(switcherCol1);
}

private void updateImageButtons() {
GwtGroupedNVPair selected = this.imagesSelectionModel.getSelectedObject();

this.imagesDelete.setEnabled(false);

String status;

if (selected == null || (status = selected.getStatus()) == null) {
return;
}

boolean isInstalled = "bndInstalled".equals(status);

this.imagesDelete.setEnabled(isInstalled);

}

private void deleteSelectedImage() {
EntryClassUi.showWaitModal();

this.securityTokenService.generateSecurityToken(new AsyncCallback<GwtXSRFToken>() {

@Override
public void onSuccess(GwtXSRFToken token) {
DockerContainersTabUi.this.deviceService.deleteImage(token,
DockerContainersTabUi.this.imagesSelectionModel.getSelectedObject().getId(),
new AsyncCallback<Void>() {

@Override
public void onFailure(Throwable caught) {
EntryClassUi.hideWaitModal();
FailureHandler.showErrorMessage(MSGS.deviceTabContainerImagesDeleteErrorMessage());
}

@Override
public void onSuccess(Void result) {
EntryClassUi.hideWaitModal();
}
});

}

@Override
public void onFailure(Throwable caught) {
EntryClassUi.hideWaitModal();
FailureHandler.handle(caught);
}
});
refresh();
}

private void startSelectedContainer() {
EntryClassUi.showWaitModal();

Expand Down Expand Up @@ -253,7 +407,73 @@ public String getValue(GwtGroupedNVPair object) {
}
};
col5.setCellStyleNames(STATUS_TABLE_ROW_STYLE);
TextHeader isFrameworkManaged = new TextHeader(MSGS.deviceTabContainerIsFrameworkManagedHeading());
TextHeader arch = new TextHeader(MSGS.deviceTabContainerIsFrameworkManagedHeading());
arch.setHeaderStyleNames(ROW_HEADER_STYLE);
bundlesGrid2.addColumn(col5, arch);

dataProvider.addDataDisplay(bundlesGrid2);
}

private void loadImagesTable(CellTable<GwtGroupedNVPair> bundlesGrid2,
ListDataProvider<GwtGroupedNVPair> dataProvider) {

TextColumn<GwtGroupedNVPair> col1 = new TextColumn<GwtGroupedNVPair>() {

@Override
public String getValue(GwtGroupedNVPair object) {
return object.getId();
}
};
col1.setCellStyleNames(STATUS_TABLE_ROW_STYLE);
TextHeader id = new TextHeader(MSGS.deviceBndId());
id.setHeaderStyleNames(ROW_HEADER_STYLE);
bundlesGrid2.addColumn(col1, id);

TextColumn<GwtGroupedNVPair> col2 = new TextColumn<GwtGroupedNVPair>() {

@Override
public String getValue(GwtGroupedNVPair object) {
return validationMessages.getString(object.getStatus());
}
};
col2.setCellStyleNames(STATUS_TABLE_ROW_STYLE);
TextHeader state = new TextHeader(MSGS.deviceBndState());
state.setHeaderStyleNames(ROW_HEADER_STYLE);
bundlesGrid2.addColumn(col2, state);

TextColumn<GwtGroupedNVPair> col3 = new TextColumn<GwtGroupedNVPair>() {

@Override
public String getValue(GwtGroupedNVPair object) {
return object.getName();
}
};
col3.setCellStyleNames(STATUS_TABLE_ROW_STYLE);
TextHeader name = new TextHeader(MSGS.deviceBndName());
name.setHeaderStyleNames(ROW_HEADER_STYLE);
bundlesGrid2.addColumn(col3, name);

TextColumn<GwtGroupedNVPair> col4 = new TextColumn<GwtGroupedNVPair>() {

@Override
public String getValue(GwtGroupedNVPair object) {
return object.getVersion();
}
};
col4.setCellStyleNames(STATUS_TABLE_ROW_STYLE);
TextHeader version = new TextHeader(MSGS.deviceBndVersion());
version.setHeaderStyleNames(ROW_HEADER_STYLE);
bundlesGrid2.addColumn(col4, version);

TextColumn<GwtGroupedNVPair> col5 = new TextColumn<GwtGroupedNVPair>() {

@Override
public String getValue(GwtGroupedNVPair object) {
return object.get("arch");
}
};
col5.setCellStyleNames(STATUS_TABLE_ROW_STYLE);
TextHeader isFrameworkManaged = new TextHeader(MSGS.deviceTabContainerImagesArchitextureCollumHeading());
isFrameworkManaged.setHeaderStyleNames(ROW_HEADER_STYLE);
bundlesGrid2.addColumn(col5, isFrameworkManaged);

Expand Down Expand Up @@ -282,6 +502,10 @@ public void onFailure(Throwable ex) {

@Override
public void onSuccess(GwtXSRFToken token) {

/**
* List Containers
*/
DockerContainersTabUi.this.gwtDeviceService.findContainers(token,
new AsyncCallback<List<GwtGroupedNVPair>>() {

Expand All @@ -295,8 +519,8 @@ public void onFailure(Throwable caught) {

@Override
public void onSuccess(List<GwtGroupedNVPair> result) {
EntryClassUi.hideWaitModal();
DockerContainersTabUi.this.isRequestRunning = false;
EntryClassUi.hideWaitModal();
for (GwtGroupedNVPair resultPair : result) {
DockerContainersTabUi.this.bundlesDataProvider.getList().add(resultPair);
}
Expand All @@ -307,9 +531,59 @@ public void onSuccess(List<GwtGroupedNVPair> result) {
updateButtons();
}
});

}

});

EntryClassUi.showWaitModal();

this.imagesDataProvider.getList().clear();

this.gwtXSRFService.generateSecurityToken(new AsyncCallback<GwtXSRFToken>() {

@Override
public void onFailure(Throwable ex) {
DockerContainersTabUi.this.isRequestRunning = false;
EntryClassUi.hideWaitModal();
FailureHandler.handle(ex);
}

@Override
public void onSuccess(GwtXSRFToken token) {

/**
* List Images
*/
DockerContainersTabUi.this.gwtDeviceService.findImages(token,
new AsyncCallback<List<GwtGroupedNVPair>>() {

@Override
public void onFailure(Throwable caught) {
DockerContainersTabUi.this.isRequestRunning = false;
EntryClassUi.hideWaitModal();
FailureHandler.handle(caught);
DockerContainersTabUi.this.imagesDataProvider.flush();
}

@Override
public void onSuccess(List<GwtGroupedNVPair> result) {
DockerContainersTabUi.this.isRequestRunning = false;
EntryClassUi.hideWaitModal();
for (GwtGroupedNVPair resultPair : result) {
DockerContainersTabUi.this.imagesDataProvider.getList().add(resultPair);
}
int size = DockerContainersTabUi.this.imagesDataProvider.getList().size();
DockerContainersTabUi.this.imagesGrid.setVisibleRange(0, size);
DockerContainersTabUi.this.imagesDataProvider.flush();
DockerContainersTabUi.this.imagesSelectionModel.clear();
updateImageButtons();
}
});
}

});

}

@Override
Expand Down
Loading

0 comments on commit 0a5c49b

Please sign in to comment.