lxd/endpoints/network.go
func (e *Endpoints) NetworkUpdateAddress(address string) error {
	if address != "" {
		address = util.CanonicalNetworkAddress(address)
	}

	oldAddress := e.NetworkAddress()
	if address == oldAddress {
		return nil
	}

	clusterAddress := e.ClusterAddress()

	logger.Infof("Update network address")

	e.mu.Lock()
	defer e.mu.Unlock()

	// Close the previous socket
	e.closeListener(network)

	// If turning off listening, we're done.
	if address == "" {
		return nil
	}

	// If the new address covers the cluster one, turn off the cluster
	// listener.
	if clusterAddress != "" && util.IsAddressCovered(clusterAddress, address) {
		e.closeListener(cluster)
	}

	// Attempt to setup the new listening socket
	getListener := func(address string) (*net.Listener, error) {
		var err error
		var listener net.Listener

		for i := 0; i < 10; i++ { // Ten retries over a second seems reasonable.
			listener, err = net.Listen("tcp", address)
			if err == nil {
				break
			}

			time.Sleep(100 * time.Millisecond)
		}

		if err != nil {
			return nil, fmt.Errorf("cannot listen on https socket: %v", err)
		}

		return &listener, nil
	}

	// If setting a new address, setup the listener
	if address != "" {
		listener, err := getListener(address)
		if err != nil {
			// Attempt to revert to the previous address
			listener, err1 := getListener(oldAddress)
			if err1 == nil {
				e.listeners[network] = networkTLSListener(*listener, e.cert)
				e.serveHTTP(network)
			}

			return err
		}

		e.listeners[network] = networkTLSListener(*listener, e.cert)
		e.serveHTTP(network)
	}

	return nil
}
func (e *Endpoints) NetworkUpdateAddress(address string) error {
	if address != "" {
		address = util.CanonicalNetworkAddress(address)
	}

	oldAddress := e.NetworkAddress()
	if address == oldAddress {
		return nil
	}

	clusterAddress := e.ClusterAddress()

	logger.Infof("Update network address")

	e.mu.Lock()
	defer e.mu.Unlock()

	// Close the previous socket
	e.closeListener(network)

	// If turning off listening, we're done.
	if address == "" {
		return nil
	}

	// If the new address covers the cluster one, turn off the cluster
	// listener.
	if clusterAddress != "" && util.IsAddressCovered(clusterAddress, address) {
		e.closeListener(cluster)
	}

	// Attempt to setup the new listening socket
	getListener := func(address string) (*net.Listener, error) {
		var err error
		var listener net.Listener

		for i := 0; i < 10; i++ { // Ten retries over a second seems reasonable.
			listener, err = net.Listen("tcp", address)
			if err == nil {
				break
			}

			time.Sleep(100 * time.Millisecond)
		}

		if err != nil {
			return nil, fmt.Errorf("cannot listen on https socket: %v", err)
		}

		return &listener, nil
	}

	// If setting a new address, setup the listener
	if address != "" {
		listener, err := getListener(address)
		if err != nil {
			// Attempt to revert to the previous address
			listener, err1 := getListener(oldAddress)
			if err1 == nil {
				e.listeners[network] = networkTLSListener(*listener, e.cert)
				e.serveHTTP(network)
			}

			return err
		}

		e.listeners[network] = networkTLSListener(*listener, e.cert)
		e.serveHTTP(network)
	}

	return nil
}
func ( e * Endpoints ) NetworkUpdateAddress ( address string ) error { if address != " " { address = util . CanonicalNetworkAddress ( address ) } oldAddress := e . NetworkAddress ( ) if address == oldAddress { return nil } clusterAddress := e . ClusterAddress ( ) logger . Infof ( " " ) e . mu . Lock ( ) defer e . mu . Unlock ( ) // Close the previous socket e . closeListener ( network ) // If turning off listening, we're done. if address == " " { return nil } // If the new address covers the cluster one, turn off the cluster // listener. if clusterAddress != " " && util . IsAddressCovered ( clusterAddress , address ) { e . closeListener ( cluster ) } // Attempt to setup the new listening socket getListener := func ( address string ) ( * net . Listener , error ) { var err error var listener net . Listener for i := 0 ; i < 10 ; i ++ { // Ten retries over a second seems reasonable. listener , err = net . Listen ( " " , address ) if err == nil { break } time . Sleep ( 100 * time . Millisecond ) } if err != nil { return nil , fmt . Errorf ( " " , err ) } return & listener , nil } // If setting a new address, setup the listener if address != " " { listener , err := getListener ( address ) if err != nil { // Attempt to revert to the previous address listener , err1 := getListener ( oldAddress ) if err1 == nil { e . listeners [ network ] = networkTLSListener ( * listener , e . cert ) e . serveHTTP ( network ) } return err } e . listeners [ network ] = networkTLSListener ( * listener , e . cert ) e . serveHTTP ( network ) } return nil }
// NetworkUpdateAddress updates the address for the network endpoint, shutting
// it down and restarting it.
NetworkUpdateAddress updates the address for the network endpoint shutting it down and restarting it .