Search in sources :

Example 16 with Tag

use of org.platformlayer.core.model.Tag in project platformlayer by platformlayer.

the class JdbcManagedItemRepository method findRoots.

@Override
@JdbcTransaction
public List<ItemBase> findRoots(ProjectId project, boolean fetchTags, SecretProvider secretProvider) throws RepositoryException {
    DbHelper db = new DbHelper(project);
    try {
        // TODO: Push-down logic for item selection as well
        JoinedQueryResult result = db.listRoots();
        List<ItemBase> roots = mapItemsAndTags(project, secretProvider, db, result);
        for (ItemBase root : roots) {
            // A little bit of paranoia
            boolean isRoot = true;
            for (Tag tag : root.getTags()) {
                boolean tagIsParent = Tag.PARENT.getKey().equals(tag.getKey());
                if (tagIsParent) {
                    isRoot = false;
                    break;
                }
            }
            assert isRoot;
            if (!isRoot) {
                throw new IllegalStateException();
            }
        }
        return roots;
    } catch (SQLException e) {
        throw new RepositoryException("Error fetching items", e);
    } finally {
        db.close();
    }
}
Also used : ItemBase(org.platformlayer.core.model.ItemBase) SQLException(java.sql.SQLException) RepositoryException(org.platformlayer.RepositoryException) Tag(org.platformlayer.core.model.Tag) JoinedQueryResult(com.fathomdb.jpa.impl.JoinedQueryResult) JdbcTransaction(com.fathomdb.jdbc.JdbcTransaction)

Example 17 with Tag

use of org.platformlayer.core.model.Tag in project platformlayer by platformlayer.

the class JdbcManagedItemRepository method changeTags.

@Override
@JdbcTransaction
public Tags changeTags(ModelClass<?> modelClass, ProjectId project, ManagedItemId itemKey, TagChanges changeTags, Long ifVersion) throws RepositoryException {
    DbHelper db = new DbHelper(modelClass, project);
    try {
        int projectId = db.mapToValue(project);
        int modelId = db.mapToValue(modelClass.getItemType());
        int serviceId = db.mapToValue(modelClass.getServiceType());
        ItemEntity rs = db.queries.findItem(serviceId, modelId, projectId, itemKey.getKey());
        if (rs == null) {
            // TODO: Better exception??
            throw new IllegalStateException("Not found");
        }
        int itemId = rs.id;
        if (ifVersion != null) {
            log.warn("CAS version swapping not implemented");
        }
        Tags tags = new Tags();
        mapToTags(db.listTagsForItem(itemId), tags);
        if (changeTags.addTags != null) {
            for (Tag addTag : changeTags.addTags) {
                if (tags.hasTag(addTag)) {
                    continue;
                }
                db.insertTag(itemId, addTag);
                tags.add(addTag);
            }
        }
        if (changeTags.removeTags != null) {
            for (Tag removeTag : changeTags.removeTags) {
                boolean removed = tags.remove(removeTag);
                if (!removed) {
                    continue;
                }
                db.removeTag(itemId, removeTag);
            }
        }
        return tags;
    } catch (SQLException e) {
        throw new RepositoryException("Error running query", e);
    } finally {
        db.close();
    }
}
Also used : SQLException(java.sql.SQLException) RepositoryException(org.platformlayer.RepositoryException) Tag(org.platformlayer.core.model.Tag) Tags(org.platformlayer.core.model.Tags) JdbcTransaction(com.fathomdb.jdbc.JdbcTransaction)

Example 18 with Tag

use of org.platformlayer.core.model.Tag in project platformlayer by platformlayer.

the class JdbcManagedItemRepository method mapItemsAndTags.

private <T extends ItemBase> List<T> mapItemsAndTags(ProjectId project, SecretProvider secretProvider, DbHelper db, JoinedQueryResult result) throws RepositoryException, SQLException {
    Multimap<Integer, Tag> itemTags = HashMultimap.create();
    for (TagEntity row : result.getAll(TagEntity.class)) {
        Tag tag = Tag.build(row.key, row.data);
        itemTags.put(row.item, tag);
    }
    List<T> items = Lists.newArrayList();
    for (ItemEntity entity : result.getAll(ItemEntity.class)) {
        if (entity == null) {
            throw new IllegalStateException();
        }
        ServiceType serviceType = db.getServiceType(entity.service);
        ItemType itemType = db.getItemType(entity.model);
        JaxbHelper jaxbHelper = getJaxbHelper(db, serviceType, itemType);
        T item = mapToModel(project, serviceType, itemType, entity, jaxbHelper, secretProvider);
        int itemId = entity.id;
        Collection<Tag> tags = itemTags.get(itemId);
        item.getTags().addAll(tags);
        items.add(item);
    }
    return items;
}
Also used : ItemType(org.platformlayer.ids.ItemType) ServiceType(org.platformlayer.ids.ServiceType) JaxbHelper(org.platformlayer.xml.JaxbHelper) Tag(org.platformlayer.core.model.Tag)

Example 19 with Tag

use of org.platformlayer.core.model.Tag in project platformlayer by platformlayer.

the class JdbcManagedItemRepository method mapToTags.

private void mapToTags(List<TagEntity> tagEntities, Tags tags) {
    // Once REMOVE_DUPLICATE_TAGS is false, we can add direct to tags
    List<Tag> addList = Lists.newArrayList();
    for (TagEntity tag : tagEntities) {
        addList.add(Tag.build(tag.key, tag.data));
    }
    if (REMOVE_DUPLICATE_TAGS) {
        List<Tag> deduplicated = Lists.newArrayList();
        HashMultimap<String, String> valueMap = HashMultimap.create();
        for (Tag tag : addList) {
            if (valueMap.put(tag.getKey(), tag.getValue())) {
                deduplicated.add(tag);
            }
        }
        addList = deduplicated;
    }
    tags.addAll(addList);
}
Also used : Tag(org.platformlayer.core.model.Tag)

Example 20 with Tag

use of org.platformlayer.core.model.Tag in project platformlayer by platformlayer.

the class ItemServiceImpl method ensureItem.

<T extends ItemBase> T ensureItem(final ProjectAuthorization auth, final T item, final boolean canExist, final boolean generateUniqueName, final String uniqueTagKey) throws OpsException {
    final ModelClass<T> modelClass = (ModelClass<T>) serviceProviderDirectory.getModelClass(item.getClass());
    if (modelClass == null) {
        throw new IllegalStateException("Unknown item type");
    }
    final Class<T> javaClass = modelClass.getJavaClass();
    // JaxbHelper jaxbHelper = JaxbHelper.get(javaClass);
    final ServiceProvider serviceProvider = modelClass.getProvider();
    String id = item.getId();
    if (Strings.isNullOrEmpty(id)) {
        if (generateUniqueName) {
            id = serviceProvider.buildItemId(modelClass, item);
        } else {
            // otherwise we end up with lots of randomly named items
            throw new OpsException("Must specify item id");
        // id = UUID.randomUUID().toString();
        // item.setId(id);
        }
    }
    ProjectId project = getProjectId(auth);
    PlatformLayerKey itemKey = new PlatformLayerKey(null, project, modelClass.getServiceType(), modelClass.getItemType(), new ManagedItemId(id));
    item.setKey(itemKey);
    item.state = ManagedItemState.CREATION_REQUESTED;
    final OpsContext opsContext = buildTemporaryOpsContext(modelClass.getServiceType(), auth);
    T created = OpsContext.runInContext(opsContext, new CheckedCallable<T, Exception>() {

        @Override
        public T call() throws Exception {
            PlatformLayerKey itemKey = item.getKey();
            T existing;
            SecretProvider secretProvider = SecretProvider.from(auth);
            if (uniqueTagKey != null) {
                boolean fetchTags = true;
                Tag uniqueTag = null;
                for (Tag tag : item.getTags()) {
                    if (Objects.equal(tag.getKey(), uniqueTagKey)) {
                        uniqueTag = tag;
                    }
                }
                if (uniqueTag == null) {
                    throw new IllegalArgumentException("Could not find unique tag");
                }
                Filter filter = TagFilter.byTag(uniqueTag);
                filter = StateFilter.excludeDeleted(filter);
                existing = null;
                List<T> existingList = repository.findAll(modelClass, itemKey.getProject(), fetchTags, secretProvider, filter);
                if (!existingList.isEmpty()) {
                    if (existingList.size() != 1) {
                        throw new IllegalArgumentException("Found multiple items with unique tag");
                    }
                    existing = existingList.get(0);
                }
                if (existing == null) {
                    itemKey = findUniqueId(item, itemKey, secretProvider);
                }
            } else {
                if (generateUniqueName) {
                    itemKey = findUniqueId(item, itemKey, secretProvider);
                }
                try {
                    boolean fetchTags = true;
                    existing = Casts.checkedCast(repository.getManagedItem(itemKey, fetchTags, secretProvider), javaClass);
                } catch (RepositoryException e) {
                    throw new OpsException("Error fetching item from database", e);
                }
            }
            if (!canExist && existing != null) {
                throw new OpsException("Item already exists");
            }
            serviceProvider.beforeCreateItem(item);
            ProjectId project = getProjectId(auth);
            T newItem;
            try {
                if (existing == null) {
                    newItem = repository.createManagedItem(project, item);
                } else {
                    item.secret = existing.secret;
                    item.setKey(existing.getKey());
                    newItem = repository.updateManagedItem(project, item);
                    TagChanges tagChanges = new TagChanges();
                    for (Tag tag : item.getTags()) {
                        if (newItem.getTags().hasTag(tag)) {
                            continue;
                        }
                        boolean uniqueTagKey = false;
                        if (tag.getKey().equals(Tag.PARENT.getKey())) {
                            uniqueTagKey = true;
                        }
                        tagChanges.addTags.add(tag);
                        if (uniqueTagKey) {
                            for (Tag oldTag : newItem.getTags().findTags(tag.getKey())) {
                                tagChanges.removeTags.add(oldTag);
                            }
                        }
                    }
                    if (!tagChanges.isEmpty()) {
                        repository.changeTags(modelClass, project, newItem.getKey().getItemId(), tagChanges, null);
                    }
                }
            } catch (RepositoryException e) {
                throw new OpsException("Error writing object to database", e);
            }
            itemKey = newItem.getKey();
            JobData jobKey = changeQueue.notifyChange(auth, itemKey, ManagedItemState.CREATION_REQUESTED);
            return newItem;
        }

        private <T extends ItemBase> PlatformLayerKey findUniqueId(final T item, final PlatformLayerKey itemKey, SecretProvider secretProvider) throws RepositoryException {
            int sequence = 0;
            while (true) {
                String tryId = item.getId();
                if (sequence != 0) {
                    tryId += sequence;
                }
                final PlatformLayerKey tryKey = itemKey.withId(new ManagedItemId(tryId));
                boolean fetchTags = false;
                ItemBase found = repository.getManagedItem(tryKey, fetchTags, secretProvider);
                if (found == null) {
                    item.setKey(tryKey);
                    return tryKey;
                }
                sequence++;
            }
        }
    });
    return created;
}
Also used : OpsException(org.platformlayer.ops.OpsException) ItemBase(org.platformlayer.core.model.ItemBase) ProjectId(org.platformlayer.ids.ProjectId) PlatformLayerKey(org.platformlayer.core.model.PlatformLayerKey) RepositoryException(org.platformlayer.RepositoryException) OpsContext(org.platformlayer.ops.OpsContext) TagChanges(org.platformlayer.core.model.TagChanges) ManagedItemId(org.platformlayer.ids.ManagedItemId) RepositoryException(org.platformlayer.RepositoryException) OpsException(org.platformlayer.ops.OpsException) ModelClass(org.platformlayer.xaas.services.ModelClass) StateFilter(org.platformlayer.StateFilter) TagFilter(org.platformlayer.TagFilter) Filter(org.platformlayer.Filter) ServiceProvider(org.platformlayer.xaas.services.ServiceProvider) List(java.util.List) Tag(org.platformlayer.core.model.Tag) JobData(org.platformlayer.jobs.model.JobData) SecretProvider(org.platformlayer.auth.crypto.SecretProvider)

Aggregations

Tag (org.platformlayer.core.model.Tag)41 OpsException (org.platformlayer.ops.OpsException)16 ItemBase (org.platformlayer.core.model.ItemBase)8 PlatformLayerKey (org.platformlayer.core.model.PlatformLayerKey)8 Tags (org.platformlayer.core.model.Tags)8 Handler (org.platformlayer.ops.Handler)8 TagChanges (org.platformlayer.core.model.TagChanges)6 JSONObject (org.json.JSONObject)4 OpenstackException (org.openstack.client.OpenstackException)4 RepositoryException (org.platformlayer.RepositoryException)4 Machine (org.platformlayer.ops.Machine)4 JdbcTransaction (com.fathomdb.jdbc.JdbcTransaction)3 SQLException (java.sql.SQLException)3 OpenstackImageClient (org.openstack.client.common.OpenstackImageClient)3 Filter (org.platformlayer.Filter)3 PlatformLayerClient (org.platformlayer.PlatformLayerClient)3 StateFilter (org.platformlayer.StateFilter)3 OpsTarget (org.platformlayer.ops.OpsTarget)3 UniqueTag (org.platformlayer.ops.UniqueTag)3 SshKey (org.platformlayer.ops.helpers.SshKey)3