Esempio n. 1
0
def migrate_images(glance_url):
    glance_client = client.RestClient()
    glance_client.auth_headers = {"x-auth-token": global_conf.admin_token}
    glance_client.management_url = glance_url
    
    tariffs = db_api.tariff_map()
    accounts = {}
    images = json.loads(glance_client.get("/images/detail"))["images"]
    for project_id in (img1["owner"] for img1 in images if img1["owner"]):
        accounts[project_id] = \
            db_api.account_get_or_create(project_id).id
    
    for img1 in images:
        if not img1["owner"]:
            continue
        account_id = accounts[img1["owner"]]
        img2 = db_api.resource_get_or_create(
            account_id, None,
            ResourceTypes.Image,
            img1["id"]
        )
        seg = Segment(
            resource_id=img2.id,
            cost=img1["size"] * tariffs.get(ResourceTypes.Image, 1) / (1024.0 ** 3),
            begin_at=utils.str_to_datetime(img1["created_at"]),
            end_at=utils.str_to_datetime(img1["deleted_at"]))
        db.session.add(seg)

    db.session.commit()
Esempio n. 2
0
def migrate_images(glance_url):
    glance_client = client.RestClient()
    glance_client.auth_headers = {"x-auth-token": global_conf.admin_token}
    glance_client.management_url = glance_url

    tariffs = db_api.tariff_map()
    accounts = {}
    images = json.loads(glance_client.get("/images/detail"))["images"]
    for project_id in (img1["owner"] for img1 in images if img1["owner"]):
        accounts[project_id] = \
            db_api.account_get_or_create(project_id).id

    for img1 in images:
        if not img1["owner"]:
            continue
        account_id = accounts[img1["owner"]]
        img2 = db_api.resource_get_or_create(account_id, None,
                                             ResourceTypes.Image, img1["id"])
        seg = Segment(resource_id=img2.id,
                      cost=img1["size"] * tariffs.get(ResourceTypes.Image, 1) /
                      (1024.0**3),
                      begin_at=utils.str_to_datetime(img1["created_at"]),
                      end_at=utils.str_to_datetime(img1["deleted_at"]))
        db.session.add(seg)

    db.session.commit()
Esempio n. 3
0
def migrate_instances(old_db_url):
    engine1 = create_engine(old_db_url)

    tariffs = db_api.tariff_map()
    instance_resources = ("local_gb", "memory_mb", "vcpus")
    instance_info_attrs = ("id", "instance_id", "project_id", "local_gb",
                           "memory_mb", "vcpus")
    instance_segment_attrs = ("id", "instance_info_id", "segment_type",
                              "begin_at", "end_at")
    instance_infos = {}
    accounts = {}
    for inst1 in engine1.execute(
            "select distinct project_id from billing_instance_info"):
        accounts[inst1.project_id] = \
            db_api.account_get_or_create(inst1.project_id).id

    for inst1 in engine1.execute("select %s from billing_instance_info" %
                                 ", ".join(instance_info_attrs)):
        account_id = accounts[inst1.project_id]
        inst2 = db_api.resource_get_or_create(account_id, None,
                                              ResourceTypes.Instance,
                                              inst1.instance_id)
        inst_dict = {
            "inst1": inst1,
            "inst2": inst2,
        }
        for rtype in instance_resources:
            inst_dict[rtype + "_id"] = db_api.resource_get_or_create(
                account_id, inst2.id, rtype, None)
        instance_infos[inst1.id] = inst_dict

    for iseg in engine1.execute("select %s from billing_instance_segment" %
                                ", ".join(instance_segment_attrs)):
        inst_dict = instance_infos[iseg.instance_info_id]
        inst1 = inst_dict["inst1"]
        begin_at = utils.str_to_datetime(iseg.begin_at)
        end_at = utils.str_to_datetime(iseg.end_at)
        inst_dict["begin_at"] = (min(inst_dict["begin_at"], begin_at)
                                 if "begin_at" in inst_dict else begin_at)
        try:
            prev = inst_dict["end_at"]
        except KeyError:
            inst_dict["end_at"] = end_at
        else:
            inst_dict["end_at"] = (max(prev, end_at) if prev else None)
        for rtype in instance_resources:
            seg = Segment(resource_id=inst_dict[rtype + "_id"].id,
                          cost=getattr(inst1, rtype) * tariffs.get(rtype, 1),
                          begin_at=begin_at,
                          end_at=end_at)
            db.session.add(seg)

    for inst_dict in instance_infos.values():
        seg = Segment(resource_id=inst_dict["inst2"].id,
                      cost=tariffs.get("nova/instance", 0),
                      begin_at=inst_dict.get("begin_at", None),
                      end_at=inst_dict.get("end_at", None))
        db.session.add(seg)

    db.session.commit()
Esempio n. 4
0
 def get_or_create(self, name):
     try:
         return self._avail[name]
     except KeyError:
         obj = db_api.account_get_or_create(
             name)
         self._avail[name] = obj
         return obj
Esempio n. 5
0
def migrate_instances(old_db_url):
    engine1 = create_engine(old_db_url)

    tariffs = db_api.tariff_map()
    instance_resources = ("local_gb", "memory_mb", "vcpus")
    instance_info_attrs = (
        "id", "instance_id", "project_id",
        "local_gb", "memory_mb", "vcpus")
    instance_segment_attrs = (
        "id", "instance_info_id",
        "segment_type", "begin_at",
        "end_at")
    instance_infos = {}
    accounts = {}
    for inst1 in engine1.execute(
        "select distinct project_id from billing_instance_info"):
        accounts[inst1.project_id] = \
            db_api.account_get_or_create(inst1.project_id).id
    
    for inst1 in engine1.execute(
        "select %s from billing_instance_info" %
        ", ".join(instance_info_attrs)):
        account_id = accounts[inst1.project_id]
        inst2 = db_api.resource_get_or_create(
            account_id, None,
            ResourceTypes.Instance,
            inst1.instance_id
        )
        inst_dict = {
            "inst1": inst1,
            "inst2": inst2,
        }
        for rtype in instance_resources:
            inst_dict[rtype + "_id"] = db_api.resource_get_or_create(
                account_id, inst2.id, 
                rtype,
                None
            )
        instance_infos[inst1.id] = inst_dict
    
    for iseg in engine1.execute(
        "select %s from billing_instance_segment" %
        ", ".join(instance_segment_attrs)):
        inst_dict = instance_infos[iseg.instance_info_id]
        inst1 = inst_dict["inst1"]
        begin_at = utils.str_to_datetime(iseg.begin_at)
        end_at = utils.str_to_datetime(iseg.end_at)
        inst_dict["begin_at"] = (min(inst_dict["begin_at"], begin_at)
                                 if "begin_at" in inst_dict else begin_at)
        try:
            prev = inst_dict["end_at"]
        except KeyError:
            inst_dict["end_at"] = end_at
        else:
            inst_dict["end_at"] = (
                max(prev, end_at) if prev
                else None)
        for rtype in instance_resources:
            seg = Segment(
                resource_id=inst_dict[rtype + "_id"].id,
                cost=getattr(inst1, rtype) * tariffs.get(rtype, 1),
                begin_at=begin_at,
                end_at=end_at)
            db.session.add(seg)

    for inst_dict in instance_infos.values():
        seg = Segment(
            resource_id=inst_dict["inst2"].id,
            cost=tariffs.get("nova/instance", 0),
            begin_at=inst_dict.get("begin_at", None),
            end_at=inst_dict.get("end_at", None))
        db.session.add(seg)

    db.session.commit()