Пример #1
0
    public async Async.Task Halt(Scaleset scaleset)
    {
        var shrinkQueue = new ShrinkQueue(scaleset.ScalesetId, _context.Queue, _log);
        await shrinkQueue.Delete();

        await foreach (var node in _context.NodeOperations.SearchStates(scaleSetId: scaleset.ScalesetId))
        {
            _log.Info($"{SCALESET_LOG_PREFIX} deleting node scaleset_id {scaleset.ScalesetId} machine_id {node.MachineId}");
            await _context.NodeOperations.Delete(node);
        }
        _log.Info($"{SCALESET_LOG_PREFIX} scaleset delete starting: scaleset_id:{scaleset.ScalesetId}");

        if (await _context.VmssOperations.DeleteVmss(scaleset.ScalesetId))
        {
            _log.Info($"{SCALESET_LOG_PREFIX}scaleset deleted: scaleset_id {scaleset.ScalesetId}");
            var r = await Delete(scaleset);

            if (!r.IsOk)
            {
                _log.WithHttpStatus(r.ErrorV).Error($"Failed to delete scaleset record {scaleset.ScalesetId}");
            }
        }
        else
        {
            var r = await Replace(scaleset);

            if (!r.IsOk)
            {
                _log.WithHttpStatus(r.ErrorV).Error($"Failed to save scaleset record {scaleset.ScalesetId}");
            }
        }
    }
Пример #2
0
    public async Async.Task <Pool> Init(Pool pool)
    {
        await _context.Queue.CreateQueue(GetPoolQueue(pool.PoolId), StorageType.Corpus);

        var shrinkQueue = new ShrinkQueue(pool.PoolId, _context.Queue, _logTracer);
        await shrinkQueue.Create();

        await SetState(pool, PoolState.Running);

        return(pool);
    }
Пример #3
0
    public async Async.Task SetSize(Scaleset scaleset, int size)
    {
        // # no longer needing to resize
        if (scaleset is null)
        {
            return;
        }
        if (scaleset.State != ScalesetState.Resize)
        {
            return;
        }

        _log.Info($"{SCALESET_LOG_PREFIX} scaleset resize: scaleset_id:{scaleset.ScalesetId} size:{size}");

        var shrinkQueue = new ShrinkQueue(scaleset.ScalesetId, _context.Queue, _log);
        // # reset the node delete queue
        await shrinkQueue.Clear();

        //# just in case, always ensure size is within max capacity
        scaleset = scaleset with {
            Size = Math.Min(scaleset.Size, MaxSize(scaleset))
        };

        // # Treat Azure knowledge of the size of the scaleset as "ground truth"
        var vmssSize = await _context.VmssOperations.GetVmssSize(scaleset.ScalesetId);

        if (vmssSize is null)
        {
            _log.Info($"{SCALESET_LOG_PREFIX} scaleset is unavailable. scaleset_id {scaleset.ScalesetId}");

            //#if the scaleset is missing, this is an indication the scaleset
            //# was manually deleted, rather than having OneFuzz delete it.  As
            //# such, we should go thruogh the process of deleting it.
            await SetShutdown(scaleset, now : true);

            return;
        }
        else if (scaleset.Size == vmssSize)
        {
            await ResizeEqual(scaleset);
        }
        else if (scaleset.Size > vmssSize)
        {
            await ResizeGrow(scaleset);
        }
        else
        {
            await ResizeShrink(scaleset, vmssSize - scaleset.Size);
        }
    }
Пример #4
0
    public async Async.Task <Pool> Halt(Pool pool)
    {
        //halt the pool immediately
        var scalesets = _context.ScalesetOperations.SearchByPool(pool.Name);
        var nodes     = _context.NodeOperations.SearchByPoolName(pool.Name);

        if (scalesets is null && nodes is null)
        {
            var poolQueue = GetPoolQueue(pool.PoolId);
            await _context.Queue.DeleteQueue(poolQueue, StorageType.Corpus);

            var shrinkQueue = new ShrinkQueue(pool.PoolId, _context.Queue, _logTracer);
            await shrinkQueue.Delete();

            _logTracer.Info($"pool stopped, deleting: {pool.Name}");
            var r = await Delete(pool);

            if (!r.IsOk)
            {
                _logTracer.Error($"Failed to delete pool: {pool.Name} due to {r.ErrorV}");
            }
        }

        if (scalesets is not null)
        {
            await foreach (var scaleset in scalesets)
            {
                if (scaleset is not null)
                {
                    await _context.ScalesetOperations.SetState(scaleset, ScalesetState.Halt);
                }
            }
        }

        if (nodes is not null)
        {
            await foreach (var node in nodes)
            {
                await _context.NodeOperations.SetHalt(node);
            }
        }

        return(pool);
    }
Пример #5
0
    public async Task <bool> CouldShrinkScaleset(Node node)
    {
        if (node.ScalesetId is Guid scalesetId)
        {
            var queue = new ShrinkQueue(scalesetId, _context.Queue, _logTracer);
            if (await queue.ShouldShrink())
            {
                return(true);
            }
        }

        if (node.PoolId is Guid poolId)
        {
            var queue = new ShrinkQueue(poolId, _context.Queue, _logTracer);
            if (await queue.ShouldShrink())
            {
                return(true);
            }
        }

        return(false);
    }