/*
*
* Copyright 2013 Netflix, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package com.netflix.ice.basic;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.S3ObjectSummary;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.netflix.ice.common.*;
import com.netflix.ice.processor.TagGroupWriter;
import com.netflix.ice.reader.*;
import com.netflix.ice.tag.Product;
import java.util.Collection;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
/**
* This class manages all BasicTagGroupManager and BasicDataManager instances.
*/
public class BasicManagers extends Poller implements Managers {
private ReaderConfig config;
private Set<Product> products = Sets.newHashSet();
private Map<Product, BasicTagGroupManager> tagGroupManagers = Maps.newHashMap();
private TreeMap<Key, BasicDataManager> costManagers = Maps.newTreeMap();
private TreeMap<Key, BasicDataManager> usageManagers = Maps.newTreeMap();
public void shutdown() {
for (BasicTagGroupManager tagGroupManager: tagGroupManagers.values()) {
tagGroupManager.shutdown();
}
for (BasicDataManager dataManager: costManagers.values()) {
dataManager.shutdown();
}
for (BasicDataManager dataManager: usageManagers.values()) {
dataManager.shutdown();
}
}
public void init() {
config = ReaderConfig.getInstance();
doWork();
start(300);
}
public Collection<Product> getProducts() {
return products;
}
public TagGroupManager getTagGroupManager(Product product) {
return tagGroupManagers.get(product);
}
public DataManager getCostManager(Product product, ConsolidateType consolidateType) {
return costManagers.get(new Key(product, consolidateType));
}
public DataManager getUsageManager(Product product, ConsolidateType consolidateType) {
return usageManagers.get(new Key(product, consolidateType));
}
@Override
protected void poll() throws Exception {
doWork();
}
private void doWork() {
logger.info("trying to find new tag group and data managers...");
Set<Product> products = Sets.newHashSet(this.products);
Map<Product, BasicTagGroupManager> tagGroupManagers = Maps.newHashMap(this.tagGroupManagers);
TreeMap<Key, BasicDataManager> costManagers = Maps.newTreeMap(this.costManagers);
TreeMap<Key, BasicDataManager> usageManagers = Maps.newTreeMap(this.usageManagers);
Set<Product> newProducts = Sets.newHashSet();
AmazonS3Client s3Client = AwsUtils.getAmazonS3Client();
for (S3ObjectSummary s3ObjectSummary: s3Client.listObjects(config.workS3BucketName, config.workS3BucketPrefix + TagGroupWriter.DB_PREFIX).getObjectSummaries()) {
String key = s3ObjectSummary.getKey();
Product product;
if (key.endsWith("_all")) {
product = null;
}
else {
String name = key.substring((config.workS3BucketPrefix + TagGroupWriter.DB_PREFIX).length());
product = config.productService.getProductByName(name);
}
if (!products.contains(product)) {
products.add(product);
newProducts.add(product);
}
}
for (Product product: newProducts) {
tagGroupManagers.put(product, new BasicTagGroupManager(product));
for (ConsolidateType consolidateType: ConsolidateType.values()) {
Key key = new Key(product, consolidateType);
costManagers.put(key, new BasicDataManager(product, consolidateType, true));
usageManagers.put(key, new BasicDataManager(product, consolidateType, false));
}
}
if (newProducts.size() > 0) {
this.costManagers = costManagers;
this.usageManagers = usageManagers;
this.tagGroupManagers = tagGroupManagers;
this.products = products;
}
}
private static class Key implements Comparable<Key> {
Product product;
ConsolidateType consolidateType;
Key(Product product, ConsolidateType consolidateType) {
this.product = product;
this.consolidateType = consolidateType;
}
public int compareTo(Key t) {
int result = this.product == t.product ? 0 : (this.product == null ? 1 : (t.product == null ? -1 : t.product.compareTo(this.product)));
if (result != 0)
return result;
return consolidateType.compareTo(t.consolidateType);
}
@Override
public boolean equals(Object o) {
if (o == null)
return false;
Key other = (Key)o;
return
this.product == other.product &&
this.consolidateType == other.consolidateType;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
if (product != null)
result = prime * result + this.product.hashCode();
result = prime * result + this.consolidateType.hashCode();
return result;
}
}
}