shift
case "${action}" in
- create|remove)
+ create)
zone_${action} $@
;;
+ remove)
+ cli_zone_remove $@
+ ;;
""|*)
if [ -n "${action}" ]; then
error "Unrecognized argument: '${action}'"
fi
}
+# Removes a zone either immediately, if it is currently down,
+# or adds a tag that the removal will be done when the zone
+# is brought down the next time.
+function cli_zone_remove() {
+ if cli_help_requested $@; then
+ cli_show_man network-zone
+ exit ${EXIT_OK}
+ fi
+
+ local zone=${1}
+ assert zone_exists ${zone}
+
+ if zone_is_up ${zone}; then
+ echo "Zone '${zone}' is up and will be removed when it goes down the next time."
+ zone_remove ${zone}
+ else
+ echo "Removing zone '${zone}' now..."
+ zone_remove_now ${zone}
+ fi
+
+ exit ${EXIT_OK}
+}
+
function cli_start() {
if cli_help_requested $@; then
cli_show_man network
# Maybe the zone create hook did not exit correctly.
# If this is the case we remove the created zone immediately.
if [ "${ret}" = "${EXIT_ERROR}" ]; then
- zone_remove ${zone}
+ zone_remove_now ${zone}
fi
}
return ${EXIT_ERROR}
fi
+ # Check if the zone is tagged for removal.
+ if zone_has_remove_tag ${zone}; then
+ error "You cannot edit a zone that is tagged for removal."
+ return ${EXIT_ERROR}
+ fi
+
local hook=$(config_get_hook $(zone_dir ${zone})/settings)
if [ -z "${hook}" ]; then
hook_zone_exec ${hook} edit ${zone} $@
}
+
function zone_remove() {
local zone=${1}
- shift
+ assert zone_exists ${zone}
- if ! zone_exists ${zone}; then
- error "Zone '${zone}' does not exist."
- return ${EXIT_ERROR}
- fi
+ # Make the zone for removal.
+ touch $(zone_dir ${zone})/.remove
+
+ log INFO "Zone '${zone}' has been tagged for removal."
+}
+
+function zone_has_remove_tag() {
+ local zone=${1}
+ assert zone_exists ${zone}
+
+ [ -e "$(zone_dir ${zone})/.remove" ]
+}
+
+# This function will remove the given zone
+# RIGHT NOW. Use zone_remove to remove it
+# at the next status change.
+function zone_remove_now() {
+ local zone=${1}
+ assert zone_exists ${zone}
+
+ log INFO "Removing zone '${zone}' right now."
- # XXX Tear this down here?
+ # Force the zone down.
+ zone_is_up ${zone} && zone_set_down ${zone}
rm -rf $(zone_dir ${zone})
}
return ${EXIT_ERROR}
fi
+ # Check if a zone has got the remove tag.
+ if zone_has_remove_tag ${zone}; then
+ error "Cannot bring up any zone which is to be removed."
+ return ${EXIT_ERROR}
+ fi
+
local hook=$(config_get_hook $(zone_dir ${zone})/settings)
if [ -z "${hook}" ]; then
hook_zone_exec ${hook} down ${zone} $@
zone_db ${zone} stopped
+
+ # Remove the zone, if it has got a remove tag.
+ if zone_has_remove_tag ${zone}; then
+ zone_remove_now ${zone}
+ fi
}
function zone_status() {
fi
hook_zone_exec ${hook} status ${zone} $@
+
+ # Show that the zone it to be removed soon.
+ if zone_has_remove_tag ${zone}; then
+ warning "This zone is tagged for removal."
+ fi
}
function zone_port() {