-- Licensed to the Apache Software Foundation (ASF) under one
-- or more contributor license agreements.  See the NOTICE file
-- distributed with this work for additional information
-- regarding copyright ownership.  The ASF licenses this file
-- to you 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.


INSERT INTO `cloud`.`disk_offering` (id, name, uuid, display_text, created, use_local_storage, type, disk_size, provisioning_type) VALUES (17, 'tinyOffering', UUID(), 'tinyOffering', NOW(), 1, 'Service', 0, 'thin');
INSERT INTO `cloud`.`service_offering` (id, cpu, speed, ram_size) VALUES (17, 1, 100, 100);
INSERT INTO `cloud`.`disk_offering` (id, name, uuid, display_text, created, type, disk_size,provisioning_type) VALUES (18, 'tinyDiskOffering', UUID(), 'tinyDiskOffering', NOW(), 'Disk', 1073741824,'thin');
INSERT INTO `cloud`.`configuration` (instance, name, value) VALUE('DEFAULT','router.ram.size', '100')
    ON DUPLICATE KEY UPDATE value = '100';
INSERT INTO `cloud`.`configuration` (instance, name, value) VALUE('DEFAULT','router.cpu.mhz','100')
    ON DUPLICATE KEY UPDATE value = '100';
INSERT INTO `cloud`.`configuration` (instance, name, value) VALUE('DEFAULT','console.ram.size','100')
    ON DUPLICATE KEY UPDATE value = '100';
INSERT INTO `cloud`.`configuration` (instance, name, value) VALUE('DEFAULT','console.cpu.mhz', '100')
    ON DUPLICATE KEY UPDATE value = '100';
INSERT INTO `cloud`.`configuration` (instance, name, value) VALUE('DEFAULT','ssvm.ram.size','100')
    ON DUPLICATE KEY UPDATE value = '100';
INSERT INTO `cloud`.`configuration` (instance, name, value) VALUE('DEFAULT','ssvm.cpu.mhz','100')
    ON DUPLICATE KEY UPDATE value = '100';
INSERT INTO `cloud`.`configuration` (instance, name, value) VALUE('DEFAULT', 'expunge.workers', '3')
    ON DUPLICATE KEY UPDATE value = '3';
INSERT INTO `cloud`.`configuration` (instance, name, value) VALUE('DEFAULT', 'expunge.delay', '60')
    ON DUPLICATE KEY UPDATE value = '60';
INSERT INTO `cloud`.`configuration` (instance, name, value) VALUE('DEFAULT', 'expunge.interval', '60')
    ON DUPLICATE KEY UPDATE value = '60';
INSERT INTO `cloud`.`configuration` (instance, name, value) VALUE('DEFAULT', 'enable.ec2.api', 'true')
    ON DUPLICATE KEY UPDATE value = 'true';
INSERT INTO `cloud`.`configuration` (instance, name, value) VALUE('DEFAULT', 'enable.s3.api', 'true')
    ON DUPLICATE KEY UPDATE value = 'true';
INSERT INTO `cloud`.`configuration` (instance, name, value) VALUE('DEFAULT', 'host', '192.168.56.1')
    ON DUPLICATE KEY UPDATE value = '192.168.56.1';
INSERT INTO `cloud`.`configuration` (instance, name, value) VALUE('DEFAULT', 'management.network.cidr', '192.168.56.0/24')
    ON DUPLICATE KEY UPDATE value = '192.168.56.0/24';
INSERT INTO `cloud`.`configuration` (instance, name, value) VALUE('DEFAULT', 'secstorage.allowed.internal.sites', '192.168.56.0/8')
    ON DUPLICATE KEY UPDATE value = '192.168.56.0/8';
INSERT INTO `cloud`.`configuration` (instance, name, value) VALUE('DEFAULT', 'system.vm.use.local.storage', 'true')
    ON DUPLICATE KEY UPDATE value = 'true';
UPDATE `cloud`.`configuration` SET value='10' where name = 'storage.overprovisioning.factor';
UPDATE `cloud`.`configuration` SET value='10' where name = 'cpu.overprovisioning.factor';
UPDATE `cloud`.`configuration` SET value='10' where name = 'mem.overprovisioning.factor';
UPDATE `cloud`.`vm_template` SET unique_name="tiny Linux",name="tiny Linux",url="http://people.apache.org/~bhaisaab/vms/ttylinux_pv.vhd",checksum="046e134e642e6d344b34648223ba4bc1",display_text="tiny Linux" where id=5;
