Verified Commit ee7b2a0b authored by João Capucho's avatar João Capucho
Browse files

Implement cleanup

parent ff61d676
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
application-prod.properties
application-dev.properties

HELP.md
target/
.mvn/wrapper/maven-wrapper.jar
+41 −21
Original line number Diff line number Diff line
package org.etsi.osl.secretcontroller;

import org.etsi.osl.tmf.sim638.model.Service;
import org.etsi.osl.tmf.sim638.model.ServiceAttributeValueChangeNotification;
import org.etsi.osl.tmf.sim638.model.ServiceCreateNotification;
import org.etsi.osl.tmf.sim638.model.ServiceUpdate;
import org.etsi.osl.tmf.sim638.model.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.jms.annotation.JmsListener;
@@ -15,12 +12,12 @@ import org.springframework.web.util.UriUtils;
import tools.jackson.databind.ObjectMapper;

import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

@Component
public class ServiceListenerBean {
    private final String vaultBaseURI;
    private final String vaultKVPath;
    private final String vaultBaseSecretUri;
    private final VaultKeyValueOperations vaultKV;

    private final CatalogClient catalogClient;
@@ -39,11 +36,23 @@ public class ServiceListenerBean {
        this.objectMapper = objectMapper;

        this.vaultKV = vaultTemplate.opsForKeyValue(kvPath, VaultKeyValueOperationsSupport.KeyValueBackend.KV_2);
        this.vaultKVPath = kvPath;

        if (vaultUri.endsWith("/"))
            this.vaultBaseURI = vaultUri.substring(0, vaultUri.length() - 1);
        else
            this.vaultBaseURI = vaultUri;
            vaultUri = vaultUri.substring(0, vaultUri.length() - 1);

        this.vaultBaseSecretUri = String.format("%s/v1/%s", vaultUri, kvPath);
    }

    protected final String getVaultServiceKey(String serviceId) {
        return String.format("service::%s", serviceId);
    }

    protected final String getVaultUri(String secretUri) {
        return String.format(
                "%s/data/%s",
                vaultBaseSecretUri,
                UriUtils.encodePathSegment(secretUri, StandardCharsets.US_ASCII)
        );
    }

    @JmsListener(destination = "${topics.EVENT_SERVICE_CREATE}", containerFactory = "topicJmsListenerContainerFactory")
@@ -61,29 +70,40 @@ public class ServiceListenerBean {

    protected void processService(Service svc) {
        final var serviceUpdate = new ServiceUpdate();
        final var secretData = new HashMap<String, String>();

        final var vaultKey = getVaultServiceKey(svc.getId());
        final var secretURI = getVaultUri(vaultKey);

        for (final var characteristic : svc.getServiceCharacteristic()) {
            if (!characteristic.getName().equals("SecretCharacheteristic"))
                continue;

            if (characteristic.getValue().getValue().startsWith(this.vaultBaseURI))
            if (characteristic.getValue().getValue().startsWith(this.vaultBaseSecretUri))
                continue;

            final var vaultKey = String.format("service::%s::%s", svc.getId(), characteristic.getName());
            final var secretData = Map.of("value", characteristic.getValue().getValue());
            this.vaultKV.put(vaultKey, Map.of("data", secretData));

            final var secretURI = String.format(
                    "%s/v1/%s/data%s",
                    vaultBaseURI,
                    vaultKVPath,
                    UriUtils.encodePathSegment(vaultKey, StandardCharsets.US_ASCII)
            );
            secretData.put(characteristic.getName(), characteristic.getValue().getValue());

            characteristic.getValue().setValue(secretURI);
            serviceUpdate.addServiceCharacteristicItem(characteristic);
        }

        if (secretData.isEmpty())
            return;

        this.vaultKV.put(vaultKey, Map.of("data", secretData));
        catalogClient.updateService(svc.getId(), serviceUpdate);
    }

    @JmsListener(destination = "${topics.EVENT_SERVICE_DELETE}", containerFactory =
            "topicJmsListenerContainerFactory")
    public void processServiceDelete(String content) {
        final var res = this.objectMapper.readValue(content, ServiceDeleteNotification.class);
        final var svc = res.getEvent().getService();

        final var vaultKey = getVaultServiceKey(svc.getId());
        final var secretURI = getVaultUri(vaultKey);

        this.vaultKV.delete(secretURI);
    }
}
+13 −0
Original line number Diff line number Diff line
spring.application.name=org.etsi.osl.secret-controller
spring.profiles.active=dev
app.kvPath=openslice
# Broker configuration
spring.artemis.mode=native
spring.artemis.broker-url=tcp://localhost:61616?jms.watchTopicAdvisories=false
# Broker topics
topics.CATALOG_UPD_SERVICE=CATALOG.UPD.SERVICE
topics.EVENT_SERVICE_CREATE=EVENT.SERVICE.CREATE
topics.EVENT_SERVICE_ATTRIBUTE_VALUE_CHANGED=EVENT.SERVICE.ATTRCHANGED
topics.EVENT_SERVICE_DELETE=EVENT.SERVICE.DELETE
# Vault configuration
vault.uri=http://localhost:8200