Exemplo n.º 1
0
//!
//! Maintenance activities to be executed when eucanetd is idle between polls.
//!
//! @param[in] pGni a pointer to the Global Network Information structure
//! @param[in] pLni a pointer to the Local Network Information structure
//!
//! @return 0 on success, 1 otherwise.
//!
//! @see
//!
//! @pre
//!     - pGni must not be NULL. pLni is ignored.
//!     - The driver must be initialized prior to calling this API.
//!
//! @post
//!
//! @note
//!
static int network_driver_system_maint(globalNetworkInfo *pGni, lni_t *pLni)
{
    int rc = 0;
    struct timeval tv;
    
    LOGTRACE("Running maintenance for '%s' network driver.\n", DRIVER_NAME());
    eucanetd_timer(&tv);

    // Is the driver initialized?
    if (!IS_INITIALIZED()) {
        LOGERROR("Failed to run maintenance activities. Driver '%s' not initialized.\n", DRIVER_NAME());
        return (1);
    }
    // Need a valid global network view
    if (!pGni) {
        LOGERROR("Failed to run maintenance for '%s' network driver. Invalid parameters provided.\n", DRIVER_NAME());
        return (1);
    }

    // Make sure midoname buffer is available
    midonet_api_cache_midos_init();

    rc = do_midonet_maint(pMidoConfig);
    return (rc);
}
Exemplo n.º 2
0
//!
//! For MIDONET VPC mode, all is done in this driver API.
//!
//! @param[in] pGni a pointer to the Global Network Information structure
//! @param[in] pLni a pointer to the Local Network Information structure
//!
//! @return EUCANETD_RUN_NO_API or EUCANETD_RUN_ERROR_API
//!
//! @see
//!
//! @pre
//!     - Both pGni and pLni must not be NULL
//!     - The driver must be initialized prior to calling this API.
//!
//! @post
//!
//! @note
//!
static u32 network_driver_system_scrub(globalNetworkInfo *pGni, globalNetworkInfo *pGniApplied, lni_t *pLni)
{
    int rc = 0;
    u32 ret = EUCANETD_RUN_NO_API;
    char versionFile[EUCA_MAX_PATH];
    int check_tz_attempts = 30;
    struct timeval tv;

    eucanetd_timer(&tv);
    // Make sure midoname buffer is available
    midonet_api_cache_midos_init();

    if (!gTunnelZoneOk) {
        LOGINFO("Checking MidoNet tunnel-zone.\n");
        rc = 1;
    }
    while (!gTunnelZoneOk) {
        // Check tunnel-zone
        rc = check_mido_tunnelzone();
        if (rc) {
            if ((--check_tz_attempts) > 0) {
                sleep(3);
            } else {
                LOGERROR("Cannot proceed without a valid tunnel-zone.\n");
                return (EUCANETD_RUN_ERROR_API);
            }
        } else {
            gTunnelZoneOk = TRUE;
        }
    }

    bzero(versionFile, EUCA_MAX_PATH);

    // Is the driver initialized?
    if (!IS_INITIALIZED()) {
        LOGERROR("Failed to scrub the system for network artifacts. Driver '%s' not initialized.\n", DRIVER_NAME());
        return (ret);
    }
    // Need a valid global network view
    if (!pGni) {
        LOGERROR("Failed to scrub the system for '%s' network driver. Invalid parameters provided.\n", DRIVER_NAME());
        return (ret);
    }

    LOGTRACE("euca VPCMIDO cache state: %s\n", midonet_api_system_changed == 0 ? "CLEAN" : "DIRTY");
    rc = do_midonet_update(pGni, pGniApplied, pMidoConfig);

    if (rc != 0) {
        LOGERROR("failed to update midonet: check log for details\n");
        // Invalidate mido cache - force repopulate
        midonet_api_system_changed = 1;
        ret = EUCANETD_RUN_ERROR_API;
    } else {
        LOGTRACE("Networking state sync: updated successfully in %.2f ms\n", eucanetd_timer_usec(&tv) / 1000.0);
    }

    return (ret);
}
Exemplo n.º 3
0
//!
//! For MIDONET VPC mode, all is done in this driver API.
//!
//! @param[in] pGni a pointer to the Global Network Information structure
//! @param[in] pLni a pointer to the Local Network Information structure
//!
//! @return EUCANETD_RUN_NO_API or EUCANETD_RUN_ERROR_API
//!
//! @see
//!
//! @pre
//!     - Both pGni and pLni must not be NULL
//!     - The driver must be initialized prior to calling this API.
//!
//! @post
//!
//! @note
//!
static u32 network_driver_system_scrub(globalNetworkInfo *pGni, globalNetworkInfo *pGniApplied, lni_t *pLni)
{
    int rc = 0;
    u32 ret = EUCANETD_RUN_NO_API;
    char versionFile[EUCA_MAX_PATH];
    int check_tz_attempts = 30;
    struct timeval tv;

    eucanetd_timer(&tv);
    // Make sure midoname buffer is available
    midonet_api_cache_midos_init();

    if (!gTunnelZoneOk) {
        LOGDEBUG("Checking MidoNet tunnel-zone.\n");
        rc = 1;
    }
    while (!gTunnelZoneOk) {
        // Check tunnel-zone
        rc = check_mido_tunnelzone();
        if (rc) {
            if ((--check_tz_attempts) > 0) {
                sleep(3);
            } else {
                LOGERROR("Cannot proceed without a valid tunnel-zone.\n");
                return (EUCANETD_RUN_ERROR_API);
            }
        } else {
            gTunnelZoneOk = TRUE;
        }
    }

    bzero(versionFile, EUCA_MAX_PATH);

    // Need a valid global network view
    if (!pGni) {
        LOGERROR("Failed to scrub the system for '%s' network driver. Invalid parameters provided.\n", DRIVER_NAME());
        return (ret);
    }

    if (!IS_INITIALIZED() || (pGni && pGniApplied && cmp_gni_vpcmido_config(pGni, pGniApplied))) {
        LOGINFO("(re)initializing %s driver.\n", DRIVER_NAME());
        if (pMidoConfig) {
            eucanetdConfig *configbak = pMidoConfig->config;
            free_mido_config(pMidoConfig);
            pMidoConfig->config = configbak;
        } else {
            LOGERROR("failed to (re)initialize config options: VPCMIDO driver not initialized\n");
            return (EUCANETD_RUN_ERROR_API);
        }
        //rc = initialize_mido(pMidoConfig, config->eucahome, config->flushmode,
        //        config->disable_l2_isolation, config->midoeucanetdhost, config->midogwhosts,
        //        config->midopubnw, config->midopubgwip, "169.254.0.0", "17");
        rc = initialize_mido(pMidoConfig, pMidoConfig->config, "169.254.0.0", "17");
        if (rc) {
            LOGERROR("failed to (re)initialize config options\n");
            return (EUCANETD_RUN_ERROR_API);
        }
        pGniApplied = NULL;
    }
    LOGTRACE("euca VPCMIDO system state: %s\n", midonet_api_system_changed == 0 ? "CLEAN" : "DIRTY");
    rc = do_midonet_update(pGni, pGniApplied, pMidoConfig);

    if (rc != 0) {
        LOGERROR("failed to update midonet: check log for details\n");
        if (rc < 0) {
            // Accept errors in instances/interface implementation.
            ret = EUCANETD_VPCMIDO_IFERROR;
        } else {
            ret = EUCANETD_RUN_ERROR_API;
        }
    } else {
        LOGTRACE("Networking state sync: updated successfully in %.2f ms\n", eucanetd_timer_usec(&tv) / 1000.0);
    }

    return (ret);
}
Exemplo n.º 4
0
/**
 * This API checks the new GNI against the system view to decide what really
 * needs to be done.
 * For MIDONET VPC mode, all is done in this driver API.
 * @param pConfig [in] a pointer to eucanetd system-wide configuration
 * @param pGni [in] a pointer to the Global Network Information structure
 * @param pGniApplied [in] a pointer to the previously successfully implemented GNI
 * @return A bitmask indicating what needs to be done. The following bits are
 *         the ones to look for: EUCANETD_RUN_NETWORK_API, EUCANETD_RUN_SECURITY_GROUP_API
 *         and EUCANETD_RUN_ADDRESSING_API.
 */
static u32 network_driver_system_scrub(eucanetdConfig *pConfig, globalNetworkInfo *pGni, globalNetworkInfo *pGniApplied) {
    int rc = 0;
    u32 ret = EUCANETD_RUN_NO_API;
    struct timeval tv;

    eucanetd_timer(&tv);
    // Make sure midoname buffer is available
    midonet_api_cache_midos_init();

    // Need a valid global network view
    if (!pConfig || !pGni) {
        LOGERROR("Failed to scrub the system for '%s' network driver. Invalid parameters provided.\n", DRIVER_NAME());
        return (ret);
    }

    int config_changed = cmp_gni_config(pGni, pGniApplied);
    if (!IS_INITIALIZED() || (pGni && config_changed)) {
        LOGINFO("(re)initializing %s driver.\n", DRIVER_NAME());
        if (pMidoConfig) {
            free_mido_config(pMidoConfig);
            gInitialized = FALSE;
        } else {
            LOGERROR("failed to (re)initialize config options: VPCMIDO driver not initialized\n");
            return (EUCANETD_RUN_ERROR_API);
        }
        rc = network_driver_init(pConfig, pGni);
        if (rc) {
            LOGERROR("failed to (re)initialize config options\n");
            return (EUCANETD_RUN_ERROR_API);
        }
        pGniApplied = NULL;
    }

    if (config_changed & GNI_CONFIG_DIFF_MIDONODES) {
        pMidoConfig->midotz_ok = FALSE;
    }

    LOGTRACE("euca VPCMIDO system state: %s\n", midonet_api_system_changed == 0 ? "CLEAN" : "DIRTY");
    rc = do_midonet_update(pGni, pGniApplied, pMidoConfig);

    if (rc != 0) {
        LOGERROR("failed to update midonet: check log for details\n");
        switch (rc) {
            case -2:
                // Accept errors in instances/interface implementation.
                ret = EUCANETD_VPCMIDO_IFERROR;
                break;
            case -1:
                // Accept errors in gateway(s) implementation.
                ret = EUCANETD_VPCMIDO_GWERROR;
                break;
            default:
                ret = EUCANETD_RUN_ERROR_API;                
        }
    } else {
        LOGTRACE("Networking state sync: updated successfully in %.2f ms\n", eucanetd_timer_usec(&tv) / 1000.0);
        pMidoConfig->config->mido_arptable_config_changed = FALSE;
    }

    return (ret);
}
Exemplo n.º 5
0
/**
 * Perform network driver upgrade. This function should be invoked once when eucanetd
 * starts.
 * @param pConfig [in] a pointer to eucanetd system-wide configuration
 * @param pGni [in] a pointer to the Global Network Information structure
 * @return 0 on success. Integer number on failure.
 */
static int network_driver_upgrade(eucanetdConfig *pConfig, globalNetworkInfo *pGni) {
    int ret = 0;
    int rc = 0;

    // Skip upgrade in flush mode
    if (pMidoConfig && pMidoConfig->config && (pMidoConfig->config->flushmode != FLUSH_NONE)) {
        LOGTRACE("\tflush mode selected. Skipping upgrade\n");
        return (0);
    }

    LOGDEBUG("Upgrade '%s' network driver.\n", DRIVER_NAME());
    if (!pConfig || !pGni) {
        LOGERROR("Invalid argument: cannot process upgrade with NULL config.\n");
        return (1);
    }

    // Make sure midoname buffer is available
    midonet_api_cache_midos_init();

    u32 mido_euca_version = 0;
    char *mido_euca_version_str = NULL;
    midoname **ipgs = NULL;
    int max_ipgs = 0;
    midoname **ips = NULL;
    int max_ips = 0;
    rc = mido_get_ipaddrgroups(VPCMIDO_TENANT, &ipgs, &max_ipgs);
    boolean found = FALSE;
    boolean do_upgrade = FALSE;
    if (!rc && max_ipgs) {
        for (int i = 0; i < max_ipgs && !found; i++) {
            if (!strcmp(ipgs[i]->name, "euca_version")) {
                rc = mido_get_ipaddrgroup_ips(ipgs[i], &ips, &max_ips);
                if (!rc && ips && max_ips) {
                    if (max_ips > 1) {
                        LOGFATAL("Unable to detect eucanetd artifacts version - %d versions\n",
                                max_ips);
                        LOGINFO("eucanetd going down.\n");
                        exit(1);
                    }
                    mido_euca_version = euca_version_dot2hex(ips[0]->ipagip->ip);
                    mido_euca_version_str = hex2dot(mido_euca_version);
                    found = TRUE;
                    LOGTRACE("\tFound %s artifacts\n", mido_euca_version_str);
                    if (mido_euca_version < dot2hex("4.4.0.0")) {
                        LOGWARN("Unable to upgrade from version %s\n", mido_euca_version_str);
                        LOGINFO("eucanetd going down.\n");
                        exit(1);
                    }
                    if (mido_euca_version < pConfig->euca_version) {
                        LOGINFO("Upgrading Eucalyptus %s to %s\n", mido_euca_version_str, pConfig->euca_version_str);
                        mido_delete_resource(ipgs[i], ips[0]);
                        do_upgrade = TRUE;
                    }
                    if (mido_euca_version > pConfig->euca_version) {
                        LOGFATAL("Downgrading Eucalyptus %s to %s not supported\n", mido_euca_version_str, pConfig->euca_version_str);
                        LOGFATAL("eucanetd going down.\n");
                        exit(1);
                    }
                }
                EUCA_FREE(ips);
            }
        }
    }
    EUCA_FREE(ipgs);

    if (do_upgrade) {
        // No 4.4->5.0 upgrade action required
/*
        // Retrieve all objects
        rc = midonet_api_cache_refresh_v_threads(MIDO_CACHE_REFRESH_ALL);
        if (rc) {
            LOGERROR("failed to retrieve objects from MidoNet.\n");
        } else {

            mido_config *mido = pMidoConfig;
            rc = do_midonet_populate(mido);
            if (rc) {
                LOGWARN("failed to populate VPC models prior to upgrade.\n");
            }
        }
*/
    }

    EUCA_FREE(mido_euca_version_str);
    return (ret);
}