可以看到两个方法都是调用了“_create_snapshot”,只是在传递第5个参数force时不一样,同时force为False时,需要传递其他几个参数(实际上也为空)。下面具体分析_create_snapshot方法:
def _create_snapshot(self, context, volume, name, description, force=False, metadata=None, cgsnapshot_id=None, group_snapshot_id=None):
"""根据上文的分析:force = True
该方法完成如下功能:
1. 执行卷状态条件判断,如果卷处于维护状态,迁移过程中,副本卷,
force=False且不是可用状态,则抛异常
2. 执行用户快照配额管理,用户可以为不同的卷类型设置不同的配额信息,如:
volumes, gigabytes,snapshots,我这里使用的是ceph rbd,例如:
{
'gigabytes':
20,
'snapshots_ceph':
1,
'gigabytes_ceph':
20,
'snapshots':
1
}
用户默认配额如下:
{
'gigabytes': 1000,
'snapshots_ceph':
-1,
'snapshots':
10,
'gigabytes_ceph':
-1
}
如果配额不足则会抛异常
3. 创建快照条目,例如(创建卷快照要先在cinder数据库创建snapshot数据库条目):
{
'status':
u'creating',
'volume_type_id':
'd494e240-17b3-4d35-a5a1-2923d8677d79',
'display_name':
u'snapshot for snapshot1',
'user_id':
'b652f9bd65844f739684a20ed77e9a0f',
'display_description':
u'',
'cgsnapshot_id':
None,
'volume_size':
20,
'encryption_key_id':
None,
'volume_id':
'60e16af2-0684-433c-a1b6-c1af1c2523fc',
'progress':
u'0%',
'project_id':
'25520b29dce346d38bc4b055c5ffbfcb',
'metadata':
{}
}